Neo4j Cypher运行示例
示例来源: Neo4j in Action.
0 准备数据
0.1 node
(user1 { name: 'John Johnson', type: 'User', email: 'jsmith@example.org', age: 35})
with Label:
(user1:Users { name: 'John Johnson', type: 'User', email: 'jsmith@example.org', age: 35})
0.2 relationship
(user1) -[:IS_FRIEND_OF]-> (user2)
with property:
(user1) -[:HAS_SEEN {stars: 5}]-> (movie1)
0.3 sample
create (user1:Users { name: 'John Johnson', type: 'User', email: 'jsmith@example.org', age: 35}),
(user2:Users { name: 'Kate Smith', type: 'User', email: 'ksmith@example.org', age: 35}),
(user3:Users { name: 'Jack Jeffries', type: 'User', email: 'jjeffries@example.org', age: 34}),
(movie1:Movies { name: 'Fargo', type: 'Movie'}),
(movie2:Movies { name: 'Alien', type: 'Movie'}),
(movie3:Movies { name: 'Heat', type: 'Movie'}),
(user1) -[:IS_FRIEND_OF]-> (user2),
(user1) -[:IS_FRIEND_OF]-> (user3),
(user1) -[:HAS_SEEN {stars: 5}]-> (movie1),
(user2) -[:HAS_SEEN {stars: 3}]-> (movie3),
(user3) -[:HAS_SEEN {stars: 4}]-> (movie1),
(user3) -[:HAS_SEEN {stars: 5}]-> (movie2)
1 模式匹配
1.1 使用node和relationship标识符
start user=node(1)
match (user)-[r:HAS_SEEN]->(movie)
return movie;
//匿名relationship
start user=node(1)
match (user)-[:HAS_SEEN]->(movie)
return movie;
//匿名node
start user=node(1)
match (user)-[r:HAS_SEEN]->()
return r;
1.2 复杂的模式匹配
// 3 nodes, 2 relationships
start john=node(1)
match john-[:IS_FRIEND_OF]->()-[:HAS_SEEN]->(movie)
return movie;
//同一查询中多个模式
start john=node(1)
match
john-[:IS_FRIEND_OF]->()-[:HAS_SEEN]->(movie),
john-[r:HAS_SEEN]->(movie)
return movie;
// where条件过滤
start john=node:users(name = "John Johnson")
match john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)
where NOT john-[:HAS_SEEN]->(movie)
return movie.name;
2 定位起始node
2.1 Id
start john=node(1)
return john;
2.2 Ids
start user=node(1, 3)
match user-[:HAS_SEEN]->movie
return distinct movie;
2.3 index
// index `users`
start john=node:users(name = "John Johnson")
return john;
// native Lucene query
start john=node:users("name:John Johnson")
return john;
// a complex Lucene query
start john=node:users("name:John* AND yearOfBirth<1980")
return john;
2.4 schema-based index
基于Label的索引只能用于查找整个属性值。
match (john:USER)
where john.name='John Johnson'
return john;
2.5 多个起始node
start john=node:users("name:John Johnson"),
jack=node:users("name:Jack Jeffries")
match john-[:HAS_SEEN]->movie, jack-[:HAS_SEEN]->movie
return movie;
3 过滤数据
// node和relationship的属性值过滤
start john=node:users("name:John Johnson")
match john-[:IS_FRIEND_OF]-(friend)
where friend.yearOfBirth > 1980
return friend;
//使用正则表达式
start john=node:users("name:John Johnson")
match john-[:IS_FRIEND_OF]-(friend)
where friend.email =~ /.*@gmail.com/
return friend;
//使用Cypher内建函数
start john=node:users("name:John Johnson")
match john-[IS_FRIEND_OF]-friend
where has(friend.twitter)
return friend
4 获取结果
4.1 返回property
//node属性
start john= node:users(name = "John Johnson")
match john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)
where not john-[:HAS_SEEN]->(movie)
return movie.name;
//relationship属性
start john=node:users("name:John Johnson")
match john-[r:HAS_SEEN]-(movie)
return r.stars
4.2 返回relathinship
start john=node:users("name:John Johnson")
match john-[r:HAS_SEEN]-(movie)
return r;
4.3 返回path
// path: `recPath`
start john=node:users(name = "John Johnson")
match recPath = john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)
where not john-[r:HAS_SEEN]->(movie)
return movie.name, recPath;
4.4 结果分页
start john=node:users("name:John Johnson")
match john-[:HAS_SEEN]->(movie)
return movie
order by movie.name // order
skip 20 // skip 2 pages
limit 10 // 10 in a page
下面涉及更新操作(5-7)。
5 创建新实体
//创建node
create newuser
{
name: 'Grace Spencer',
yearOfBirth: 1982,
email: 'grace@mycompany.com'
}
return newuser;
//创建relationship
start john = node:users(name = "John Johnson"), grace = node(10)
create john-[r:IS_FRIEND_OF]->grace
return r;
// 同时创建node和relationship
start john = node:users(name = "John Johnson")
create john -[r:IS_FRIEND_OF]->
(grace {
name: 'Grace Spencer',
yearOfBirth: 1982, email: 'grace@mycompany.com'
})
return r, grace;
//使用`unique`仅创建模式中不存在的实体
start john = node:users(name = "John Johnson")
create unique john -[r:IS_FRIEND_OF]->
(grace {
name: 'Grace Spencer',
yearOfBirth: 1982,
email: 'grace@mycompany.com'
})
return r, grace;
6 删除数据
//删除node,仅在node没有relationship时
start grace = node(10)
delete grace
//删除node和relationship
start grace = node(10)
match grace-[r]-()
delete grace, r
7 更新node和relationship属性
//更新node属性
start john=node:users(name = "John Johnson")
set john.yearOfBirth = 1973;
//更新多个node的属性
start user=node(1,2)
set user.group = 'ADMINISTRATOR'
//删除node属性,Neo4j不允许null属性值
start n=node(1)
delete n.group;
下面是Cypher的高级用法(8-11)。
8 聚合
//按`user`聚合,即结果中非所有非聚合字段
start user=node(*)
match user-[:IS_FRIEND_OF]-()
return user, count(*)
order by count(*) desc;
其他数值聚合函数:SUM, AVG, MAX, MIN。
start john=node:users(name = "John Johnson")
match john-[:IS_FRIEND_OF]-(friend)
where HAS(friend.yearOfBirth)
return avg(2014-friend.yearOfBirth);
9 函数
9.1 实体内部属性
ID(node), TYPE(relationship)
//relationship的类型
start n=node:users(name='John Johnson)
match n-[rel]-()
return TYPE(rel), count(*);
9.2 集合函数
HAS(graphEntity.propertyName)
NODES(path):将path转换为node集合
ALL(x in collection where predicate(x))
NONE(x in collection where predicate(x))
ANY(x in collection where predicate(x))
SINGLE(x in collection where predicate(x))
start john=node:users(name = "John Johnson"),
kate= node:users(name = "Kate Smith"),
match p=john-[:IS_FRIEND_OF*1..3]-(kate)
where ALL(
user in NODES(p)
where HAS(user.facebookId)
)
return p;
10 用WITH子句管道化
// simulate SQL `HAVING` clause
start n=node(1)
match n-[rel]-()
with TYPE(rel) as type, count(*) as count
where count > 1
return type, count;
11 Cypher兼容性
//指定Neo4j的版本
CYPHER 1.8 start n=node(1)
match n-[rel]-()
with TYPE(rel) as type, count(*) as count
where count > 1
return type, count;
Neo4j Cypher运行示例的更多相关文章
- Neo4j Cypher语法(三)
目录 5 函数 5.1 谓词函数 5.2 标量函数 5.3 聚合函数 5.4 列表函数 5.5 数学函数 5.6 字符串函数 5.7 Udf与用户自定义函数 6 模式 6.1 索引 6.2 限制 7 ...
- neo4j安装与示例
Neo4j有两种访问模式:服务器模式和嵌入模式参考,下面主要讲windows下这两种模式的配置与访问示例 1 Windows下Neo4j服务器模式安装与示例 安装: 1.下载Neo4j,我下载的版本是 ...
- Servlet与Tomcat运行示例
Servlet与Tomcat运行示例 本文将写一个servlet,然后将其部署到Tomcat的全过程.本文参考<深入拆解Tomcat_Jetty>内容. 一.基于web.xml开发步骤 下 ...
- Windows上配置Mask R-CNN及运行示例demo.ipynb
最近做项目需要用到Mask R-CNN,于是花了几天时间配置.简单跑通代码,踩了很多坑,写下来分享给大家. 首先贴上官方Mask R-CNN的Github地址:https://github.com/m ...
- Kurento安装与入门02——运行示例前的准备
官方一共提供了13个示例,这些示例运行的方式大同小异,一般会提供JAVA.Browser JavaScript.Node.js三种版本,这里仅演示java版本的示例.这些示例要求系统内已经正确安装了K ...
- Neo4j Cypher语法(二)
目录 4 子句 4.1 CREATE 4.2 MATCH 4.3 Match 4.4 Create match return连用来返回一个关系基础 4.5 Optional_match 4.6 Wit ...
- Neo4j Cypher查询语言详解
Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...
- Neo4j Cypher语法(一)
目录 Cypher手册详解 1 背景 2 唯一性 3 语法 3.1 命名规则 3.2 表达式 3.3 变量与保留关键字 3.4 参数 3.5 操作符 3.6 模式 3.7 列表 Cypher手册详解 ...
- Hadoop版Helloworld之wordcount运行示例
1.编写一个统计单词数量的java程序,并命名为wordcount.java,代码如下: import java.io.IOException; import java.util.StringToke ...
随机推荐
- gdb进行多线程调试
http://blog.csdn.net/xabc3000/article/details/6819867 http://www.cnblogs.com/xuxm2007/archive/2011/0 ...
- 关于jQuery源码分析
http://www.w3ctech.com/topic/256 jQuery源码剖析(一)——概览&工具方法
- 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记
docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...
- 《BI那点儿事》数据流转换——数据转换
数据转换执行类似于T-SQL中的函数CONVERT或CAST的功能.数据转换的编辑界面如图,选择需要转换的列,在DataType下拉列表中选择需要的数据类型.Output Alias栏内设置输出时使用 ...
- java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51
http://blog.csdn.net/e_wsq/article/details/52100234 一日换了一下MyEclipse,换成2016CI,结果从SVN上下载了一个工程后出现以下错误: ...
- Php数据类型之整型详解
php中支持的数据类型 在php中主要支持8种数据类型.和3中伪类型的一个形式.8种数据类型分为以下三3大类,第一个就是我们的标量类型,标量类型它只能存储单一数据,那第二大类就是我们的复合类型,第三个 ...
- 《浅谈磁盘控制器驱动》,磁盘控制器驱动答疑解惑![2012.1.29完结]by skyfree
<浅谈磁盘控制器驱动>,磁盘控制器驱动答疑解惑![2012.1.29完结] https://www.itiankong.net/thread-178655-1-1.html Skyfre ...
- havok之内存管理
[现象记录] 1.往world和rb里都各自加入一个entityListener,当这个rb被remove掉之后, 会首先调用world里的listener的removecallback, 再调用rb ...
- VMware克隆后,网卡若干问题
网卡问题 由于克隆虚拟机,vmware只是修改了虚拟机的名字等信息,并没有修改虚拟硬盘中的任何信息, 导致克隆后网卡的MAC地址和操作系统中记录的mac地址不符,导致eth0启动不起来. 操作系统记录 ...
- Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式
由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...