neo4j 学习-2
Neo4j 查询例句
- MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof) RETURN john.name, fof.name
- MATCH (user)-[:friend]->(follower)
- WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
- RETURN user.name, follower.name
CREATE
(DELETE
): 创建或删除节点/关系SET
(REMOVE
): 给属性 赋/ 删 值;给节点 添/删 标签MERGE
: 匹配一个节点,如果该节点不存在。则创建该节点MATCH
: 从图中查询信息。如:节点、节点属性、节点关系 等等WHERE
: 它不是一个单独的句子。但是它是MATCH
OPTIONAL MATCH
,WITH
的一部分,进行限定或者是过滤。或者对WITH
的返回结果进行过滤。RETURN
: 后接 你想要返回的值、及其格式
- MATCH (n {name: 'John'})-[:FRIEND]-(friend)
- WITH n, count(friend) AS friendsCount
- WHERE friendsCount > 3 // 对 with 的值进行过滤
- RETURN n, friendsCount
- MATCH (n {name: 'John'})-[:FRIEND]-(friend)
- WITH n, count(friend) AS friendsCount
- SET n.friendsCount = friendsCount
- RETURN n.friendsCount
The RETURN
句子有三个字句,对结果进行处理 : SKIP
、LIMIT
和 ORDER BY
.
任何对图进行更新的语句,都会在一个 事务中进行.
- CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }),(david:User { name: 'David'}),(adam)-[:FRIEND]->(pernilla),(pernilla)-[:FRIEND]->(david)
- MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend)
- RETURN friend_of_a_friend.name AS fofName
- // 1 这个句子和下面这个句子 2 的结果是一样的,但不同于 3
- MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),(friend)-[r2:FRIEND]-(friend_of_a_friend)RETURN friend_of_a_friend.name AS fofName
- // 2 这个句子和 句子 1 效果相同,但是不同于句子 3.虽然中间用“,”号分开了,但他们仍然是一个match句。
- MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
- MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
- RETURN friend_of_a_friend.name AS fofName
- // 3 词句子不同于上面的 句子 1 和句子 2 ,因为这是两个match 句子。
- MATCH (n)
- RETURN
- CASE n.eyes // 这里已经限定了 n.eyes 值 的 类型。
- WHEN 'blue'
- THEN 1
- WHEN 'brown'
- THEN 2
- ELSE 3 END AS result
- // 用 n.eyes 的值,依次和 when 条件进行对,直到得到正确的。返回相应的 then 的值。如果到最后也没有找到正确的,那么就返回 else
- // 条件的值。如果未设置 else 条件的值,那么返回 null
- MATCH (n)
- RETURN
- CASE
- WHEN n.eyes = 'blue'
- THEN 1
- WHEN n.age < 40
- THEN 2
- ELSE 3 END AS result
- // 依次计算各个 when 条件,直到找到正确的表达式,返回相应的 then 的 值。如果最后也没有找到正确的表达式
- // 那么就返回 else 的值。如果 未设置 else 的值,那么 返回 null
- 以下是变量的一些用法:
- {
- "name" : "Johan"
- }
-
- MATCH (n:Person)
- WHERE n.name = $name
- RETURN n
-
- MATCH (n:Person { name: $name })
- RETURN n
- {
- "regex" : ".*h.*"
- }
- MATCH (n:Person)
- WHERE n.name =~ $regex
- RETURN n.name
- // =~ 后跟正则表达式
- {
- "s" : 1,
- "l" : 1
- }
-
- MATCH (n:Person)
- RETURN n.name
- SKIP $s
- LIMIT $l
- {
- "ids" : [ 0, 1, 2 ]
- }
-
- MATCH (n)
- WHERE id(n) IN $ids // in
- RETURN n.name
- WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames
- UNWIND somenames AS names // unwind 解包
- WITH names AS candidate
- WHERE candidate STARTS WITH 'Jo'
- RETURN candidate
- WITH [2, 4, 7, 9, 12] AS numberlist
- UNWIND numberlist AS number
- WITH number
- WHERE number = 4 OR (number > 6 AND number < 10) // and or 的用法,cypher 也支持 异或
- RETURN number
- RETURN [1,2,3,4,5]+[6,7] AS myList // 此处 + 用来组合列表。 + 也可以用于拼接字符串
- WITH ['Anne', 'John', 'Bill', 'Diane', 'Eve'] AS names
- RETURN names[1..3] AS result // 切片 “..” 作用等同于 “:”
- (a:User:Admin)-->(b) // 当一个 node 有多个label
变长模式匹配
- (a)-[*2]->(b) // 2 表示路径长度是 2 ,也叫深度为 2
-
- (a)-->(c)-->(b) // (a)-->(c) 这就是一个路径长度,包含一个关系两个节点。
- (a)-[*3..5]->(b) // 表示 (a)(b)之间的路径长度是3 到5 之间(3,5 都包括)
- (a)-->()-->()-->(b)
- (a)-->()-->()-->()-->(b)
- (a)-->()-->()-->()-->()-->(b)
- (a)-[*3..]->(b) // (a),(b)之间的路径距离为 3 及其以上
- (a)-[*..5]->(b) //(a),(b)之间的路径为 5 及其以下
- (a)-[*]->(b) // (a),(b) 之间的路径距离为 任意值
- MATCH (me)-[:KNOWS*1..2]-(remote_friend)
- WHERE me.name = 'Filipa'
- RETURN remote_friend.name // me 的名字是 Filipa, 返回 和我是 KNOWS 关系的 路径距离是 1 到 2之间 // 的节点(人) 的属性(名字)
可变长度关系不可用于MATCH
and MERGE
.
一组相互连接的关系和节点被称为 path
, Cypher 允许用一个标识符,你也可以用同样的方法,命名 MATCH
CREATE
、MERGE
。 注意,这种用标识符命名的方式,不能用于匹配表达式。
You can do this in MATCH
, CREATE
and MERGE
, but not when using patterns as expressions.
- p = (a)-[*3..5]->(b) // 不知道为啥,我做不成功
- return range(1,10) as list
- [1,2,3,4,5,6,7,8,9,10] // 注意:在cyper 中,range() 是包含右边界的。
- return range(1,10)[3]
- 3
- RETURN range(0, 10)[-3]
- 8
- RETURN range(0, 10)[0..3] // 切片 相当于python 的 :,注意 这种切片是 含左不含右的
- [0,1,2]
- RETURN range(0, 10)[0..-5]
- [0,1,2,3,4,5] // 右边 “-” 的存在使 右边 的边界元素也 包括 进了切片中
- RETURN range(0, 10)[-5..]
- [6,7,8,9,10] // 不同 左边的“-” 使 切片 不 包括左边的边界元素
- RETURN range(0, 10)[..4]
- [0,1,2,3] // 相当于 [:4]
- RETURN range(0, 10)[5..15]
- [5,6,7,8,9,10] // 超出边界会被截断,只显示 当前具有的一组片段
-
- RETURN range(0, 10)[15]
- null // 但如果是单个元素,那么就会返回 null,而不是报错
- RETURN [x IN range(0,10) WHERE x % 2 = 0 | x^3] AS result // "|" 管道符的使用,结果的传递处理
- match (n{name:"an"}) return [(n)--(b) where b:Person|b.name] as name
- [sun,ma] // 一次返回 ,在一个结果里面(可以通过查看 返回的json 格式来发现他们的区别)
- MATCH (a:Person { name: 'anxibin' })-[r]-(b:Person) return b.name
- sun ,ma //分两次返回,分别在不同的结果里面
-
- with predicates just like a normal WHERE clause, but will yield a custom projection as specified. // predicates 谓语 projection 投影
- MATCH (a:Person) return a.name,a.age,a.from
- // 查看返回结果的 json 格式,可以看出,它的键一起在一个地方,值一起在另一个地方,键值分离了。
- // "a.name" "a.age" "a.from"
- // "sun" 18 null
- // "ma" 19 null
- // map projection 映射
- MATCH (a:Person)return a {.name,.age,.from}
- // 查看结果的json 格式,可以看出,他们的键值对是在一起的。
- {"name":"sun","age":18,"from":null}
- {"name":"ma","age":19,"from":null}
- MATCH (a:Person)return a {.*}
- // {"name":"Emil","from":"beijing","klout":99}
- // {"name":"an","age":20}
- // {"name":"zhen","age":9}
- // 如果map 中是 .* ,那么就会只显示变量自己所拥有的全部属性。而不像上面似的,指定了返回的属性值,如果,该变量没有那个属性值,就只能以 null 填充
- // 注意,如果 变量 a 指向的是一个 null 值,那么所有的返回值都是 null
- MATCH (a:Person{name:"an"})-[:KNOWS]->(n:Person)return a{.name,.age,friens:n{.name,.age}}
- // {"name":"an","age":20,"friens":{"name":"sun","age":21}}
- // 变量名也可以作为键
- MATCH (a:Person{name:"an"})-[:KNOWS]->(n:Person)return a{.name,.age,friens:collect(n{.name,.age})}
-
- // {"name":"an","age":20,"friens":[{"name":"sun","age":21}]}
- // 也可以在聚合函数之类的函数中使用
In Cypher, null
is used to represent missing or undefined values. null
is not equal to null
. Not knowing two values does not imply that they are the same value. So the expression null
= null
yields null
and not true
.
Expression | Result |
---|---|
2 IN [1, 2, 3] | true |
2 IN [1, null , 3] |
null |
2 IN [1, 2, null ] |
true |
2 IN [1] | false |
2 IN [] | false |
null IN [1, 2, 3] |
null |
null IN [1, null , 3] |
null |
null IN [] |
false |
Expressions that return null
Getting a missing element from a list:
[][0]
,head([])
Trying to access a property that does not exist on a node or relationship:
n.missingProperty
Comparisons when either side is
null
:1 < null
Arithmetic expressions containing
null
:1 + null
Function calls where any arguments are
null
:sin(null)
neo4j 学习-2的更多相关文章
- Neo4j学习笔记(1)——使用API编写一个Hello World程序
项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理. 首先创建一个Maven Project,添加依赖: <dependency> <groupId& ...
- Neo4j学习——基本操作(一)
由于开始学习知识图谱,因此需要涉及到neo4j的使用一.介绍neo4j是一个图形数据库基于Java开发而成,因此需要配置jvm才可以运行配置请参考我前面的一篇blog:https://www.cnbl ...
- Neo4j学习笔记(1)——使用Java API实现简单的增删改查
阅读目录 项目的创建及配置 使用嵌入式数据库 创建节点和关系 查询及更新 删除关系和节点 完整代码 参考资料 回到顶部 项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管 ...
- Neo4j 学习笔记(-)
Neo4j 的使用说明(一)(基于V3.4.9) 下一篇(二):https://www.cnblogs.com/infoo/p/11947467.html 一.Neo4j简介 Neo4j是一个高性能的 ...
- Neo4j学习笔记(2)——数据索引
和关系数据库一样,Neo4j同样可以创建索引来加快查找速度. 在关系数据库中创建索引需要索引字段和指向记录的指针,通过索引可以快速查找到表中的行. 在Neo4j中,其索引是通过属性来创建,便于快速查找 ...
- neo4j 学习笔记
1.参考 https://blog.csdn.net/appleyk/article/category/7408344 系列文章 (不支持 spring boo 2.0 以下的,入门可做参考) 2.底 ...
- Neo4j学习笔记
1. 环境搭建 正好最近同学有一台阿里云服务器借我玩,就尝试着在服务器上搭了Neo4j. 环境:CentOS Linux release 7.4.1708 (Core) 安装Java 安装Neo4j需 ...
- Neo4j学习案例【转】
转自 打怪的蚂蚁 CSDN: https://blog.csdn.net/xgjianstart/article/details/77285334 neo4j有社区版本和企业版.社区版本是免费的,只支 ...
- neo4j 学习-1
Neo4j 子句 ```MATCH (:Person { name: 'an' })-[r]->(:Persion) RETURN type(r) // 返回关系的类型 如:r 就是 'KNOW ...
随机推荐
- 洛谷4030(Codeplus11月月赛)可做题1
题目:https://www.luogu.org/problemnew/show/P4030 原来一个方阵巧妙的充要条件是该方阵的每个2*2子方阵都是巧妙的!!! 可以把每一行选的列视为一个排列,需要 ...
- golang sizeof 占用空间大小
C语言中,可以使用sizeof()计算变量或类型占用的内存大小.在Go语言中,也提供了类似的功能, 不过只能查看变量占用空间大小.具体使用举例如下. package main import ( &qu ...
- linux下的pd
东西叫OpenSystemArchitect 地址在http://www.codebydesign.com/SystemArchitect 运行之前,先sudo apt-get install lib ...
- fiddler链接手机
fiddler设置: 见python_request-上海悠悠 哪里有说 手机和window设置: 1,要把电脑防火墙关掉 2.手机访问http://ip:port安装Fiddler证书,特别注意IO ...
- C++ 什么叫做离散化
C++ 什么叫做离散化 如果说今年这时候OIBH问得最多的问题是二分图,那么去年这时候问得最多的算是离散化了.对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”.“对坐标的近似处理” ...
- chapter1 初识Go语言
1.1 语言简史 1.2 语言特性 I:自动垃圾回收 II:更丰富的内置类型 数组切片(Slice):是一种动态增长的数组. III:函数多返回值 func getName()(firstName, ...
- sqoop2的使用测试
查看现有link sqoop:000> show link+-----------+------------------------+---------+| Name | Co ...
- mysq在命令行模式下执行shell命令
mysql可以在命令行模式下执行shell命令 mysql> help For information about MySQL products and services, visit: htt ...
- viewer 照片查看器
viewer 照片查看器 效果: api: https://github.com/fengyuanchen/viewerjs#methods npm: npm install viewerjs 使用: ...
- [PHP]用户登陆中间件
Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里 ...