neo4j中节点及关系的查询、删除等
由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:3 年前
Neo4j 查询、删除
1 |
|
n和m代表节点,r代表relationship关系
(n)-[r]-(m)代表一种模式,即n节点和m节点由r关系联系起来
MATCH (n)-[r]-(m) RETURN的意思是查询并返回所有与(n)-[r]-(m)模式匹配的节点和关系。
* LIMIT 100是限制条件,意思是仅需返回前100个匹配到的结果(节点和关系)。
查询重复节点
可以分为以下步骤解决:
1、先查看下某个标签下的节点总数
1
match (n:PERSON) return count(n)
2、比较总数和去重后总数,可判断是否存在相同name的节点
1
match (n:PERSON) return count(distinct n.name)
若执行步骤1和步骤2,得到的数量相同,则证明没有重复的节点
3、若重复节点较少,可通过设置id条件进行删除
4、若重复节点较多,可用apoc来进行操作(需要安装apoc插件,地址:https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases)
1
2
3
4
5
6
7MATCH (n:Tag)
WITH n.name AS name,
COLLECT(n) AS nodelist,
COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node
查询重复关系
查询
1
2
3MATCH (a)-[r]-(b)
with count(type(r)) as num,a,b
where num >= 2 return num,a,b LIMIT 25删除
1
2
3
4MATCH (a)-[r]-(b)
WITH a, b, TAIL (COLLECT (r)) as rr
WHERE size(rr)>0
FOREACH (r IN rr | DELETE r)修改节点的 label ,可以先新加 label ,再删除旧的的label
1
match (n:old) set n:NEW remove n:old
修改关系的 label
1
2
3MATCH (n:drug)-[r:indication]-(m:disease)
CREATE (n)-[r2:drug_disease]->(m)
DELETE r删除某个节点及对应的关系
1
MATCH (n:Disease)-[r]-() where n.name="{f}" DELETE n,r
节点添加属性
1
MATCH (n { name: 'Andres' }) SET n.surname = 'Taylor' RETURN n.name, n.surname
关系添加属性
1
MATCH p=()-[r:`尾部`]->() SET r={title:"尾部"} RETURN p
查询某节点深度关系
变长路径的模式
(a)-[*2]->(b) : 表示路径长度为2, 起始节点是a,终止节点是b;
(a)-[*3..5]->(b) : 表示路径长度最小为2,最大为5, 起始节点是a,终止节点是b;
(a)-[*..5]->(b) : 表示路径长度最大为5, 起始节点是a,终止节点是b;
(a)-[*3..]->(b) : 表示路径长度最小为3, 起始节点是a,终止节点是b;
(a)-[*]->(b) : 表示不限制路径长度, 起始节点是a,终止节点是b;
所有深度
1
2match(n:TargetGene{name:'TOP2A'})-[r*]-(m) return n,r,m limit 100 ## 某节点的所有关系
match p=()--() return p limit 25 ## 所有节点所有关系一级深度(某节点关联的一级所有节点及关系)
1
2
3
4
5match p=(n:TargetGene{name:'TOP2A'}) -[]-() return p ## [] 前后的 - 代表关系的方向,如果没有箭头表示所有方向(中括号[]可省略)
match(n:TargetGene{name:'TOP2A'})-[r]-(m) return n,r,m ## 与上条命令效果相同
match p=(n:TargetGene{name:'TOP2A'}) -[]->() return p ## 表示TOP2A指向外部的所有节点及关系
match p=(n:TargetGene{name:'TOP2A'}) <-[]-() return p ## 表示指向TOP2A的所有节点及关系指定深度
1
match(n:TargetGene{name:'TOP2A'})-[r*..3]-(m) return n,r,m limit 100
查询某两个节点是否有关系
1 |
|
查询深度关系(r*3表示3级)
1
match p=(n:TargetGene{name:'MIR7-1'})-[r*3]-(m:Disease{name:'breast cancer'}) return p
使用where进行查询
1
match p=(n:TargetGene)-[r*3]-(m:Disease) where n.name="MIR7-1" and m.name="breast cancer" return p
使用正则忽略大小写
“(?i)strings” 其语法为 : =“regexp” 区分大小写的模糊匹配; =~”(?i)regexp” 不区分大小写的模糊匹配1
match p=(n:TargetGene)-[r*3]-(m:Disease) where n.name=~"(?i)mir7-1" and m.name="breast cancer" return p
最短路径查询
方法一:1
match p=shortestPath((n:TargetGene{name:"MIR7-1"})-[r*]-(m:Disease{name:"breast cancer"})) return p
方法二:
加入了忽略大小写1
2match (n:TargetGene),(m:Disease) where n.name=~"(?i)mir7-1" and m.name="breast cancer"
with n,m match p=shortestpath((n)-[r*]-(m)) return p;查询多个药物与某个疾病的最短路径
1
match (m:Drug), (n:Disease) where m.name=~'(?i)DOXYLAMINE|FESOTERODINE|TROPICAMIDE|Dexmedetomidine' and n.name=~'(?i)Systemic sclerosis' with n,m match p=shortestpath((n)-[r*]-(m)) return p
删除
通过 name 属性 删除这一个节点
1
MATCH (n:TEST1{name:'temp'}) delete n
通过 id 属性 删除这一个节点
1
MATCH (r) WHERE id(r) = 492 DELETE r
删除一个节点及其所有的关系
1
MATCH (r) WHERE id(r) = 493 DETACH DELETE r
删除所有节点和所有的关系
1
MATCH (r) DETACH DELETE r
删除一个标签中所有的节点
1
MATCH (r:Loc) DETACH DELETE r
删除标签
1
:schema ### 查询标签所对应的索引
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!