Giter Site home page Giter Site logo

goneo4jgql's Introduction

goneo4jgql

Neo4j example using Golang, GraphQL and Docker

Stack

Introduction

This is just a simple example on how to implement a GraphQL API on top of Neo4j using Golang. I have included the Neo4j movie example dataset that has the following domain model:

domain

Note: I have slightly modified the original dataset by adding UUIDs to each node. You can find the cypher queries I used for that at the end of the movies.cypher import file

Setup (Using Docker)

You just need to install Docker and Docker compose (included with the latest version of Docker).

1 - Clone this repo

git clone https://github.com/charlysan/pyrfidhid.git

2 - Build app docker image

docker-compose build

3 - Startup Neo4j and goneo4jgql containers:

docker-compose up -d

Check the logs

docker-compose logs -f

You should get an output like this one:

$ docker-compose logs -f
Attaching to goneo4jgql, neo4j
goneo4jgql | time="2020-04-16T05:54:09Z" level=info msg="Connected to Neo4j Server" neo4j_server_uri="bolt://neo4j:7687" prefix=main
goneo4jgql | time="2020-04-16T05:54:09Z" level=info msg="API Listening" api_url="0.0.0.0:8080" prefix=main
neo4j    | Fetching versions.json for Plugin 'apoc' from https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json
neo4j    | Installing Plugin 'apoc' from https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.5.0.9/apoc-3.5.0.9-all.jar to /plugins/apoc.jar
neo4j    | Applying default values for plugin apoc to neo4j.conf
neo4j    | Skipping dbms.security.procedures.unrestricted for plugin apoc because it is already set
neo4j    | Active database: graph.db
neo4j    | Directories in use:
neo4j    |   home:         /var/lib/neo4j
neo4j    |   config:       /var/lib/neo4j/conf
neo4j    |   logs:         /logs
neo4j    |   plugins:      /plugins
neo4j    |   import:       /var/lib/neo4j/import
neo4j    |   data:         /var/lib/neo4j/data
neo4j    |   certificates: /var/lib/neo4j/certificates
neo4j    |   run:          /var/lib/neo4j/run
neo4j    | Starting Neo4j.
neo4j    | 2020-04-16 05:54:27.396+0000 INFO  ======== Neo4j 3.5.17 ========
neo4j    | 2020-04-16 05:54:27.470+0000 INFO  Starting...
neo4j    | 2020-04-16 05:54:59.164+0000 INFO  Bolt enabled on 0.0.0.0:7687.
neo4j    | 2020-04-16 05:55:05.645+0000 INFO  Started.
neo4j    | 2020-04-16 05:55:09.186+0000 INFO  Remote interface available at http://localhost:7474/

4 - Load movie dataset

docker-compose exec neo4j /bin/bash -c 'cat /var/lib/neo4j/import/movies.cypher | cypher-shell -u neo4j -p test'

That's all. You should be able to login to Neo4j browser at http://127.0.0.1:7474/browser/

Use the default credentials set in dockercompose.yml file

user: neo4j
pass: test

browser

GraphQL API Usage

You should be able to access Playground at http://0.0.0.0:8080/playground:

browser

GraphQL queries examples

Get the list of movies

query movies {
  movies {
    title
    released
    tagline
  }
}

browser]

Get the list of movies with title containing "top"

query movies {
  movies (title: "top") {
    title
    released
    tagline
  }
}

Get cast, directors and writer data

query movies {
  movies (title: "top") {
    title
    released
    tagline
    cast {
      name
    }
    directors {
      name
    }
    writers {
      name
    }
  }
}

browser]

Get the list of participations for each cast member for Top Gun

query movies {
  movies (title: "top") {
    title
    released
    tagline
    cast {
      name
      participated {
        role
        movie {
          title
        }
      }
    }
  }
}

browser

Final notes

  • I haven't included any dotaloader yet, so expect performance issues for complex graphql queries.
  • This is a very simple example made as a proof of concept for a neo4j-grapqhl-go stack. I'm not including any interesting query to take advantage of the real power of graph dbs (at least not in this first version).
  • I haven't added any graphql depth/complexity limiting mechanism, so take that into consideration when executing complex queries.
  • I used Neo4j v3.5 instead of v4 because bolt connector does not support yet the latest v4 protocol.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.