Neo4j Versions

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#.

At the end of the day, you always need to start with a working Cypher query, then work out the equivalent C#.

Need more help?

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.

Then, once we have the answer, we can add it to this page too so it helps other people.

User class

Most of the examples below assume you have the following class, to represent the structure of a user node:

public class User
{
public long Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}

Get all users by label

This Cypher:

MATCH (user:User)
RETURN user

Is this C#:

graphClient.Cypher
.Match("(user:User)")
.Return(user => user.As<User>())
.Results

Get specific user

This Cypher:

MATCH (user:User)
WHERE user.Id = 1234
RETURN user

Is this C#:

graphClient.Cypher
.Match("(user:User)")
.Where((User user) => user.Id == 1234)
.Return(user => user.As<User>())
.Results

Get a user, and the count of their friends

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

Get a user, and all their friends

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

Create a user

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.

Create a user, only if they don't already exist

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();

Create a user and relate them to an existing one

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();

Relate two existing users

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();

Relate two existing users, only if they aren't related already

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();

Update a single property on a user

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.

Replace all the properties on a user

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();

Delete a user

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();

Delete a user and all inbound relationships

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();

Get all labels for a specific user

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

Get all labels for a specific user, and still the user too

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

Get a user, count their friends then add this number to the user and return.

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

原文地址:https://www.cnblogs.com/ulex/p/6066083.html

Neo4j使用简单例子的更多相关文章

  1. Neo4j使用简单例子(转)

    Neo4j Versions Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip th ...

  2. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  3. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  4. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  5. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  6. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  7. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  8. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  9. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

随机推荐

  1. CSS:CSS 列表

    ylbtech-CSS:CSS 列表 1.返回顶部 1. CSS 列表 CSS列表属性作用如下: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 列表 在HTML ...

  2. Invoking destroy method 'close' on bean with name 'dataSource'

    Invoking destroy method 'close' on bean with name 'dataSource' Spring与Mybatis整合时出现的问题,找了一晚上结果是一个属性写错 ...

  3. 我看Spring MVC系列(一)

    1.Spring MVC是什么: Spring MVC:Spring框架提供了构建Web应用程序的全功能MVC模块. 2.Spring helloWorld应用(基于Spring 4.2) 1.添加S ...

  4. IIS身份验证和文件操作权限(三、ASP.NET模拟)

    一.配置ASP.NET模拟 注意:在配置[ASP.NET模拟]是还要配置[匿名身份验证]不知道为什么,有知道可以留言,互相学习 二.浏览站点 -- 操作文件 ①无操作权限 点击写入 ②有操作权限(特定 ...

  5. JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  6. STL unique

    1: template <class ForwardIterator> 2: ForwardIterator unique (ForwardIterator first, ForwardI ...

  7. 剑指offer——61平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树.   题解: 方法一:使用深度遍历,判断每个节点是不是平衡二叉树,这种从上至下的方法会导致底层的节点重复判断多次 方法二:使用后序遍历判断,这种 ...

  8. 【AI图像识别一】人脸识别测试探索

    ****************************************************************************** 本文主要介绍AI能力平台的人脸识别技术的测 ...

  9. ATM+购物车结构

    ATM+购物车 1.需求分析 2.程序设计及目录设计 3.编写程序 4.调试程序

  10. jQuery validate验证隐藏表单(hidden)域

    validate很不错的一个jQuery表单验证插件.升级到了1.9版的后,发现隐藏表单域验证全部失效,特别是在jquery.ui.tabs.min.js构造的Tabs里的验证!网上一搜,也没查到是怎 ...