Read

REST

We can use the REST interface to perform simple queries

For example, by using curl.

Nodes

We can query information from nodes by doing:

curl http://localhost:7474/db/data/node/1

We get back all the information about “Node 1”

{
  "outgoing_relationships" : "http://localhost:7474/db/data/node/1/relationships/out",
  "data" : {
    "title" : "The Matrix",
    "year" : 1999
  },
  "traverse" : "http://localhost:7474/db/data/node/1/traverse/{returnType}",
  "all_typed_relationships" : "http://localhost:7474/db/data/node/1/relationships/all/{-list|&|types}",
  "property" : "http://localhost:7474/db/data/node/1/properties/{key}",
  "self" : "http://localhost:7474/db/data/node/1",
  "properties" : "http://localhost:7474/db/data/node/1/properties",
  "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/1/relationships/out/{-list|&|types}",
  "incoming_relationships" : "http://localhost:7474/db/data/node/1/relationships/in",
  "extensions" : {
  },
  "create_relationship" : "http://localhost:7474/db/data/node/1/relationships",
  "paged_traverse" : "http://localhost:7474/db/data/node/1/paged/traverse/{returnType}{?pageSize,leaseTime}",
  "all_relationships" : "http://localhost:7474/db/data/node/1/relationships/all",
  "incoming_typed_relationships" : "http://localhost:7474/db/data/node/1/relationships/in/{-list|&|types}"
}

and by adding more details to our URL we can be more specific about our query.

For example, we can focus on the properties

curl http://localhost:7474/db/data/node/1/properties

and get back

{
  "title" : "The Matrix",
  "year" : 1999
}

or even more specifically

curl http://localhost:7474/db/data/node/1/properties/title

and get back

"The Matrix"

or focus on the “year” part of the Properties

curl http://localhost:7474/db/data/node/1/properties/year

and get back

1999

Relationships

We can query information from relationships by doing:

curl http://localhost:7474/db/data/relationship/1

We get back all the information about “Node 1”

{
  "start" : "http://localhost:7474/db/data/node/4",
  "data" : {
  },
  "self" : "http://localhost:7474/db/data/relationship/1",
  "property" : "http://localhost:7474/db/data/relationship/1/properties/{key}",
  "properties" : "http://localhost:7474/db/data/relationship/1/properties",
  "type" : "LIKES",
  "extensions" : {
  },
  "end" : "http://localhost:7474/db/data/node/2"
}

Paths

Things become more interesting when we explore how two nodes might be connected.

This can be done by looking for Paths between two nodes.

Using curl we can explore the Paths from “Node 1” to “Node 4”

curl  -X POST http://localhost:7474/db/data/node/1/paths \
  -H "Content-type: application/json" \
  -d '{"to":"http://localhost:7474/db/data/node/4","algorithm":"shortestPath","max_depth":10}'

In our case this returns a simple direct relationship

[ {
  "start" : "http://localhost:7474/db/data/node/1",
  "nodes" : [ "http://localhost:7474/db/data/node/1", "http://localhost:7474/db/data/node/4" ],
  "length" : 1,
  "relationships" : [ "http://localhost:7474/db/data/relationship/3" ],
  "end" : "http://localhost:7474/db/data/node/4"
} ]

But, when we look for Paths from “Node 1” to “Node 5”

curl  -X POST http://localhost:7474/db/data/node/1/paths \
  -H "Content-type: application/json" \
  -d '{"to":"http://localhost:7474/db/data/node/5","algorithm":"shortestPath","max_depth":10}'

we get a more interesting sequence

[ {
  "start" : "http://localhost:7474/db/data/node/1",
  "nodes" : [ "http://localhost:7474/db/data/node/1", "http://localhost:7474/db/data/node/4", "http://localhost:7474/db/data/node/6", "http://localhost:7474/db/data/node/5" ],
  "length" : 3,
  "relationships" : [ "http://localhost:7474/db/data/relationship/3", "http://localhost:7474/db/data/relationship/6", "http://localhost:7474/db/data/relationship/4" ],
  "end" : "http://localhost:7474/db/data/node/5"
} ]

Here we go through three relationships.

This is easier to visualize if we look back at our Data Browser page

../_images/Neo4jDBDataConsole09.png

Exercise

  • Find Paths between two of your friends
  • Find Paths between the favorite movie of one of your friends and the favorite movie of another friend. Did you find any surprises ?
  • Find Paths between two directors

Gremlin

Gremlin is a Graph language hosted in Groovy.

Groovy is a language created as a superset of Java.

Gremlin is a common interface for Graph databases, and in particular, it is offered through the WebAdmin interface of Neo4j.

To reach the Gremlin console

  • Go to the WebAdmin page
  • Select the tab “Power tool Console”
  • In the right button menu, select “Gremlin”
../_images/Neo4jGremlinConsole01.png

Gremlin uses slightly different terms than Neo4j to describe a graph

Neo4j Gremlin
Node Vertex
Relationship Edge

Graph

Gremlin refers to the Graph by using the variable “g”.

We can list the Vertices (Nodes) of the Graph by using

g.V

and get in our case

../_images/Neo4jGremlinConsole02.png

We can list the Edges (Relationships) of the Graph by using

g.E

and get in our case

../_images/Neo4jGremlinConsole03.png

To see the Properties of a particular Vertex we can use the “map()” method in the subscripted Vertex.

In our case, using “v” lowercase:

g.v(3).map()

returns

==> {name=Richard LaGravanase}

Filters

We can also use Filters in order to select subsets of the Vertices.

The command

g.V.filter{it.name=='Terry Gross'}

returns in our case

==> v[6]

and we can verify the rest of Properties by doing

g.v(6).map()

that returns

==> name=Terry Gross
==> gender=Female

We can see the outgoing Edges (Relationships) of a Vertex (Node) by using the function “outE()”.

g.v(6).outE()

that returns in our case

==> e[4][6-LIKES->5]

and we can see the incoming Edges (Relationships) by using the function “inE()”

g.v(6).inE()

that returns in our case

==> e[6][4-IS_FRIEND_OF->6]

or we can get both with the function “bothE()”

==> e[6][4-IS_FRIEND_OF->6]
==> e[4][6-LIKES->5]

These same functions can be invoked in the filter itself as

g.V.filter{it.name=='Terry Gross'}.inE()
g.V.filter{it.name=='Terry Gross'}.outE()
g.V.filter{it.name=='Terry Gross'}.bothE()

The parenthesis “()” in Gremlin functions are optional.

We could call equally

g.V.filter{it.name=='Terry Gross'}.inE
g.V.filter{it.name=='Terry Gross'}.outE
g.V.filter{it.name=='Terry Gross'}.bothE

However, if we add an argument to the functions, we can create implicit filters.

For example

g.V.filter{it.name=='Terry Gross'}.outE('LIKES')

will return the list of all the Relationship of type “LIKES” that are departing from “Terry Gross” Vertex.

Therefore:

g.V.filter{it.name=='Terry Gross'}.outE('LIKES').inV

will be the list of all the Vertices that “Terry Gross” likes.

Exercise

  • Find all the Relationships defined by edges incoming in one of your favorite movies.

Functions

The following are the most common functions used to navigate the Graph

From a Vertex

  • inE = List of incoming Edges
  • outE = List of outgoing Edges

From an Edge

  • inV = The Vertex to which this Edge arrive.
  • outV = The Vertex from which this Edge depart.

Concatenation

Expressions can continue to be concatenated.

In this way we can express more complex and interesting queries.

For example

g.V.filter{it.name=='Terry Gross'}.outE('LIKES')

show us all the Relationships of type “LIKES” outgoing from Terry Gross.

We can be more specific and look at the Vertices to which this relationships point.

g.V.filter{it.name=='Terry Gross'}.outE('LIKES').inV

and now we can add one step more to see the titles of all the movies that Terry Gross likes:

g.V.filter{it.name=='Terry Gross'}.outE('LIKES').inV.title

To see the list of outgoing relationships of frienship we could do

g.V.filter{it.name=='Terry Gross'}.outE('IS_FRIEND_OF')

and to see the names of all the friends

g.V.filter{it.name=='Terry Gross'}.outE('IS_FRIEND_OF').inV.name

Exercises

  • Do a query for the names of all your friends
  • Do a query for the names of all the friends of your friends
  • Do a query for the titles of the movies that your friends like
  • Find the names of all the people who like your favorite movie
  • Find the Directors of movies that your friends like
  • For your favorite movie find: People who likes this movie, also like these other movies...