Neo4j使用简单例子(转)
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
Neo4j使用简单例子(转)的更多相关文章
- Neo4j使用简单例子
Neo4j Versions Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip th ...
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- ko 简单例子
Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...
随机推荐
- MyBatis 插入主键方式和返回主键
这使用的mysql数据库,下面这种方式(没有给mysql设置自动增长)是插入主键方式: <insert id="insertBook" parameterType=" ...
- PHP(六)PHP和HTML混合的一种形式
- (连通图 缩点 强联通分支)Popular Cows -- poj --2186
http://poj.org/problem?id=2186 Description Every cow's dream is to become the most popular cow in th ...
- MFC中的DLL、LIb文件的创建、使用
动态链接库Dynamic-Linked Lib 的创建与使用 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软 ...
- 通过HttpClient请求webService
通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...
- 机器学习—集成学习(XGBoost)
一.原理部分: 二.xgboost实现 看看大神的博客瞬间了解:https://blog.csdn.net/han_xiaoyang/article/details/52665396
- Web 应用简单测试方案
测试:一定要分阶段测试,先确定入队列成功,再测试队列的执行是否成功. 功能点: 1. 翻页2. 加精3. 置顶4. 帖子浏览量(PV)5. 发帖6. 回复7. 评论 8. crontab 脚本 @20 ...
- 点滴笔记(二):利用JS对象把值传到后台
记得以前刚写asp.net 从前台往后台传值 都是var data=A,B,C,D,E; 循环添加用逗号隔开 后台还要被测试测出只输入,就错了 哈哈..后来用✈◆类似的符号隔开 不是长久之计... 现 ...
- 8.使用Exists监控ZNode的三大Change事件
一. zookeeper是一个分布式的协调程序(所有程序都是通过订阅它来相互感知) 1. tcp(长链接) + watcher server ->client client ->ser ...
- 使用google chrome抓取数据:抓取全国的高中的数据
http://tomycat.github.io/blog/other/2014/05/28/use-google-chrome-capture-data.html