forked from neo4jrb/activegraph
-
Notifications
You must be signed in to change notification settings - Fork 0
Neo4j::Core Cypher
andreasronge edited this page Apr 19, 2012
·
26 revisions
“Cypher” is a declarative graph query language that allows for expressive and efficient querying of the graph store without having to write traversals through the graph structure in code. Neo4j.rb provides two ways of using cypher: express queries as Strings or use the Neo4j.rb Cypher DSL.
The cypher language is described here: Neo4j Cypher Docuementation
q = Neo4j._query("START n=node(42) RETURN n")
q.first(:n) #=> the @node
q.columns.first => :n
See Neo4j#query method.
See http://docs.neo4j.org/chunked/snapshot/cypher-cookbook-friend-finding.html Let say we want to express the following Cypher Query:
START joe=node(some node id)
MATCH joe-[:knows]->friend-[:knows]->friend_of_friend, joe-[r?:knows]->friend_of_friend
WHERE r IS NULL
RETURN friend_of_friend.name, COUNT(*)
ORDER BY COUNT(*) DESC, friend_of_friend.name
This can be done like this:
Neo4j.query(joe_node) do |joe|
friends_of_friends = node(:friends_of_friends)
joe > ':knows' > node(:friend) > ':knows' > friends_of_friends
r = rel('r?:knows').as(:r)
joe > r > friends_of_friends
r.exist?
ret(friends_of_friends[:name], count).desc(count).asc(friends_of_friends[:name])
end
Or like this using the outgoing
instead of the >
operator
Neo4j.query(joe_node) do |joe|
friends_of_friends = joe.outgoing(:knows).outgoing(:knows)
r = rel('r?:knows').as(:r)
joe > r > friends_of_friends
r.exist?
ret(friends_of_friends[:name], count).desc(count).asc(friends_of_friends[:name])
end