Neo4j Versionsnode
Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip the START
clause, and use clauses like MERGE
. The focus of this page is about Cypher-to-C# syntax though, and should be equally useful in helping you translate a Neo4j 1.9 query to C#.git
At the end of the day, you always need to start with a working Cypher query, then work out the equivalent C#.github
If you have a working Cypher query, but can't translate it to C#, just post it on http://stackoverflow.com/questions/tagged/neo4jclient and we'll help you out pretty quickly.post
Then, once we have the answer, we can add it to this page too so it helps other people.ui
Most of the examples below assume you have the following class, to represent the structure of a user node:this
public class User { public long Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } }
This Cypher:code
MATCH (user:User) RETURN user
Is this C#:orm
graphClient.Cypher .Match("(user:User)") .Return(user => user.As<User>()) .Results
This Cypher:ip
MATCH (user:User) WHERE user.Id = 1234 RETURN user
Is this C#:ci
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 1234) .Return(user => user.As<User>()) .Results
This Cypher:
OPTIONAL MATCH (user:User)-[FRIENDS_WITH]-(friend:User) WHERE user.Id = 1234 RETURN user, count(friend) AS NumberOfFriends
Is this C#:
graphClient.Cypher .OptionalMatch("(user:User)-[FRIENDS_WITH]-(friend:User)") .Where((User user) => user.Id == 1234) .Return((user, friend) => new { User = user.As<User>(), NumberOfFriends = friend.Count() }) .Results
This Cypher:
OPTIONAL MATCH (user:User)-[FRIENDS_WITH]-(friend:User) WHERE user.Id = 1234 RETURN user, collect(friend) AS NumberOfFriends
Is this C#:
graphClient.Cypher .OptionalMatch("(user:User)-[FRIENDS_WITH]-(friend:User)") .Where((User user) => user.Id == 1234) .Return((user, friend) => new { User = user.As<User>(), Friends = friend.CollectAs<User>() }) .Results
This Cypher:
CREATE (user:User { Id: 456, Name: 'Jim' })
Should use parameters:
CREATE (user:User {newUser})
And is this C#:
var newUser = new User { Id = 456, Name = "Jim" }; graphClient.Cypher .Create("(user:User {newUser})") .WithParam("newUser", newUser) .ExecuteWithoutResults();
Note that we're using an explicitly named parameter (newUser
) and the query, and the WithParam
method to supply it. This keeps our encoding safe, protects against Cypher-injection attacks, and improves performance by allowing query plans to be cached.
This Cypher:
MERGE (user:User { Id: 456 }) ON CREATE user SET user.Name = 'Jim'
Should use parameters:
CREATE (user:User { Id: {id} }) ON CREATE user SET user = {newUser}
And is this C#:
var newUser = new User { Id = 456, Name = "Jim" }; graphClient.Cypher .Merge("(user:User { Id: {id} })") .OnCreate() .Set("user = {newUser}") .WithParams(new { id = newUser.Id, newUser }) .ExecuteWithoutResults();
This Cypher:
MATCH (invitee:User) WHERE invitee.Id = 123 CREATE invitee-[:INVITED]->(invited:User {newUser})
Is this C#:
var newUser = new User { Id = 456, Name = "Jim" }; graphClient.Cypher .Match("(invitee:User)") .Where((User invitee) => invitee.Id == 123) .Create("invitee-[:INVITED]->(invited:User {newUser})") .WithParam("newUser", newUser) .ExecuteWithoutResults();
This Cypher:
MATCH (user1:User), (user2:User) WHERE user1.Id = 123, user2.Id = 456 CREATE user1-[:FRIENDS_WITH]->user2
Is this C#:
graphClient.Cypher .Match("(user1:User)", "(user2:User)") .Where((User user1) => user1.Id == 123) .AndWhere((User user2) => user2.Id == 456) .Create("user1-[:FRIENDS_WITH]->user2") .ExecuteWithoutResults();
This Cypher:
MATCH (user1:User), (user2:User) WHERE user1.Id = 123, user2.Id = 456 CREATE UNIQUE user1-[:FRIENDS_WITH]->user2
Is this C#:
graphClient.Cypher .Match("(user1:User)", "(user2:User)") .Where((User user1) => user1.Id == 123) .AndWhere((User user2) => user2.Id == 456) .CreateUnique("user1-[:FRIENDS_WITH]->user2") .ExecuteWithoutResults();
This Cypher:
MATCH (user:User) WHERE user.Id = 123 SET user.Age = 25
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 123) .Set("user.Age = {age}") .WithParam("age", 25) .ExecuteWithoutResults();
Note: we're using parameters again to pass in data. Never do this via string concatenation like Set("user.Age = " + age.ToString())
otherwise you will introduce encoding bugs, security risks, and significantly impact your query performance by bypassing the query plan cache in Neo4j itself.
This Cypher:
MATCH (user:User) WHERE user.Id = 123 SET user = { Id: 123, Age: 25, Email: 'tatham@oddie.com.au' }
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 123) .Set("user = {tatham}") .WithParam("tatham", new User { Id = 123, Age = 25, Email = "tatham@oddie.com.au" }) .ExecuteWithoutResults();
This Cypher:
MATCH (user:User) WHERE user.Id = 123 DELETE user
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 123) .Delete("user") .ExecuteWithoutResults();
This Cypher:
OPTIONAL MATCH (user:User)<-[r]-() WHERE user.Id = 123 DELETE r, user
Is this C#:
graphClient.Cypher .OptionalMatch("(user:User)<-[r]-()") .Where((User user) => user.Id == 123) .Delete("r, user") .ExecuteWithoutResults();
This Cypher:
MATCH (user:User) WHERE user.Id = 1234 RETURN labels(user)
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 1234) .Return(user => user.Labels()) .Results
This Cypher:
MATCH (user:User) WHERE user.Id = 1234 RETURN user, labels(user)
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 1234) .Return(user => new { User = user.As<User>(), Labels = user.Labels() }) .Results
Note: This is an example of using Neo4j 3.0 Stored Procedures. There are other ways of adding a property to an object, this is just an example of CALL and YIELD, using apoc Neo4j Stored Procedures
This Cypher:
MATCH (user:User) WHERE user.Id = 1234 WITH user, size((user)-[:IS_FRIENDS_WITH]->(:Friend)) as numberOfFriends CALL apoc.map.setKey(user, 'numberOfFriends', numberOfFriends) YIELD value AS userWithFriends RETURN userWithFriends
Is this C#:
graphClient.Cypher .Match("(user:User)") .Where((User user) => user.Id == 1234) .With("user, size((user)-[:IS_FRIENDS_WITH]->(:Friend)) as numberOfFriends") .Call("apoc.map.setKey(user, 'numberOfFriends', numberOfFriends)").Yield("value AS userWithFriends") .Return(userWithFriends => new { User = userWithFriends.As<User>() }) .Results