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.

goneo4jgql's People

Contributors

charlysan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

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.