30
Building a GraphQL Service Backed by Neo4j William Lyon @lyonwj lyonwj.com type User { name: ID! address: String seen: [Movie] @relation(name: "RATED") recommended(first:Int = 5): [Movie] @cypher(statement: ’’’MATCH (u)-->(:Movie)<--(:User)-->(reco:Movie) WHERE NOT (u)-[:RATED]->(reco) RETURN reco, count(*) as score’’’ }

Building A GraphQL Service Backed By Neo4j

Embed Size (px)

Citation preview

Page 1: Building A GraphQL Service Backed By Neo4j

Building a GraphQL Service Backed by Neo4j

William Lyon@lyonwj

lyonwj.comtype User { name: ID! address: String seen: [Movie] @relation(name: "RATED") recommended(first:Int = 5): [Movie] @cypher(statement:

’’’MATCH (u)-->(:Movie)<--(:User)-->(reco:Movie) WHERE NOT (u)-[:RATED]->(reco)

RETURN reco, count(*) as score’’’}

Page 2: Building A GraphQL Service Backed By Neo4j

William LyonDevRel Engineering @neo4j

[email protected]@lyonwj

lyonwj.com

Page 3: Building A GraphQL Service Backed By Neo4j

GraphQL + Neo4j

● An overview of GraphQL● Building a GraphQL service● Neo4j-GraphQL integration(s)● GRANDstack

@lyonwj | lyonwj.com

Page 4: Building A GraphQL Service Backed By Neo4j

An Overview Of GraphQL● A new paradigm for buildings APIs● Schema definition

○ Types○ GraphQL entry points (Query & Mutation types)

● Query language for APIs○ Limited support for “queries” (aggregations, filtering, …)

● Community of tools○ GraphiQL○ Mocking○ Performance monitoring

@lyonwj | lyonwj.com

Page 5: Building A GraphQL Service Backed By Neo4j

bit.ly/_graphiql

Page 6: Building A GraphQL Service Backed By Neo4j

Building A GraphQL Service

1) Define a schema2) Implement resolver functions

○ Fetch data from data layer

@lyonwj | lyonwj.com

Page 7: Building A GraphQL Service Backed By Neo4j

Building A GraphQL Service

https://dzone.com/refcardz/an-overview-of-graphql

@lyonwj | lyonwj.com

Page 8: Building A GraphQL Service Backed By Neo4j

GraphQL First Development

1. Design API schema2. Build UI and backend3. Deploy!

• Schema is your friend• GraphQL Schema is the API spec

• Allows for simultaneous frontend and backend development

• Enables introspection• Build other tools (graphiql)

https://dev-blog.apollodata.com/navigating-your-transition-to-graphql-28a4dfa3acfb

Page 9: Building A GraphQL Service Backed By Neo4j

IDL Schema Syntaxtype Movie { movieId: ID! title: String year: Int plot: String poster: String imdbRating: Float genres: [String] similar(first: Int=3, offset:Int=0): [Movie]}

type Query {moviesByTitle(subString: String!, first: Int=3, offset: Int=0): [Movie]

}

Page 10: Building A GraphQL Service Backed By Neo4j

GraphQL Resolver Functions

https://github.com/grand-stack/grand-stack-movies-workshop/blob/master/graphql/end/src/schema.js

Page 11: Building A GraphQL Service Backed By Neo4j

GraphQL Resolver Functions

https://github.com/grand-stack/grand-stack-movies-workshop/blob/master/graphql/end/src/schema.js

Page 12: Building A GraphQL Service Backed By Neo4j

Apollo Launchpad

https://launchpad.graphql.com/x57134qwl

Page 13: Building A GraphQL Service Backed By Neo4j

A GraphQL - Neo4j Integration?

● Developer productivity● Translate GraphQL → Cypher?● Improve performance?● Expose Cypher through GraphQL?

@lyonwj | lyonwj.com

Page 14: Building A GraphQL Service Backed By Neo4j

neo4j-graphql

github.com/neo4j-graphql/neo4j-graphql-js

neo4j.com/developer/graphql/

github.com/neo4j-graphql/neo4j-graphql

Page 15: Building A GraphQL Service Backed By Neo4j

Use The Schema, Luke

Page 16: Building A GraphQL Service Backed By Neo4j

Use The Schema, Luke

https://github.com/neo4j-graphql/

Page 17: Building A GraphQL Service Backed By Neo4j

Improved Performance

● N+1 query problem○ Batching

● GraphQL → single Cypher query○ Single round trip to database

@lyonwj | lyonwj.com

Page 18: Building A GraphQL Service Backed By Neo4j

Expose Cypher in GraphQL● GraphQL directives● @cypher schema directive

○ Map GraphQL fields to a Cypher query

@lyonwj | lyonwj.com

Page 19: Building A GraphQL Service Backed By Neo4j

@cypher Schema Directives

● Still a single Cypher query / single round-trip○ @cypher annotated query becomes a sub-query

@lyonwj | lyonwj.com

Page 20: Building A GraphQL Service Backed By Neo4j

neo4j-graphql-js

github.com/neo4j-graphql/neo4j-graphql-jshttps://launchpad.graphql.com/7kp8l0p4j

Auto-generate Cypher queriesWorks with apollo-server, graphql-tools, graphql-js,...

Page 21: Building A GraphQL Service Backed By Neo4j

The GRAND stack

grandstack.io

Page 22: Building A GraphQL Service Backed By Neo4j

The GRAND stack

grandstack.io

Page 23: Building A GraphQL Service Backed By Neo4j

Looking Forward

● Active development○ Feedback driven :-)

[email protected]

neo4j.com/developer/graphql/

grandstack.io/

@lyonwj | lyonwj.com

Page 24: Building A GraphQL Service Backed By Neo4j

Resources

Page 25: Building A GraphQL Service Backed By Neo4j

neo4jsandbox.com

Page 26: Building A GraphQL Service Backed By Neo4j

grandstack.io

Page 27: Building A GraphQL Service Backed By Neo4j

http://bit.ly/grandstack

Page 28: Building A GraphQL Service Backed By Neo4j

https://1vn07jo3j3.codesandbox.io/

Page 29: Building A GraphQL Service Backed By Neo4j
Page 30: Building A GraphQL Service Backed By Neo4j

(you)-[:HAVE]->(questions)<-[:ANSWERS]-(will)

@lyonwj | lyonwj.com