Adding relationship to existing nodes with Cypher

In Neo4j 2.0 you can create schema indexes for your labels and the properties you use for lookup: CREATE INDEX ON :User(username) CREATE INDEX ON :Role(name) To create relationships you might use: MATCH (u:User {username:’admin’}), (r:Role {name:’ROLE_WEB_USER’}) CREATE (u)-[:HAS_ROLE]->(r) The MATCH will use an index if possible. If there is no index, it will lookup … Read more

Neo4j: Match multiple labels (2 or more)

You can put this condition in the WHERE clause: MATCH (n) WHERE n:Male OR n:Female RETURN n EDIT As @tbaum points out this performs an AllNodesScan. I wrote the answer when labels were fairly new and expected the query planner to eventually implement it with a NodeByLabelScan for each label, as it does for the … Read more

Return node if relationship is not present

Update 01/10/2013: Came across this in the Neo4j 2.0 reference: Try not to use optional relationships. Above all, don’t use them like this: MATCH a-[r?:LOVES]->() WHERE r IS NULL where you just make sure that they don’t exist. Instead do this like so: MATCH a WHERE NOT (a)-[:LOVES]->() Using cypher for checking if relationship doesn’t … Read more

Neo4j – Cypher vs Gremlin query language

For general querying, Cypher is enough and is probably faster. The advantage of Gremlin over Cypher is when you get into high level traversing. In Gremlin, you can better define the exact traversal pattern (or your own algorithms) whereas in Cypher the engine tries to find the best traversing solution itself. I personally use Cypher … Read more