neo4j中节点及关系的查询、删除等

由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:2 年前

Neo4j 查询、删除

1
MATCH (n)-[r]-(m) RETURN * LIMIT 100  等价于 MATCH p=()--() RETURN p LIMIT 100

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
    7
    MATCH (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
    3
    MATCH (a)-[r]-(b) 
    with count(type(r)) as num,a,b
    where num >= 2 return num,a,b LIMIT 25
  • 删除

    1
    2
    3
    4
    MATCH (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
    3
    MATCH (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
    2
    match(n:TargetGene{name:'TOP2A'})-[r*]-(m) return n,r,m limit 100  ## 某节点的所有关系
    match p=()--() return p limit 25 ## 所有节点所有关系
  • 一级深度(某节点关联的一级所有节点及关系)

    1
    2
    3
    4
    5
    match 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
match (:节点标签1{name:'xx'})-[r]-(:节点标签2{name:'xx'}) return r,type(r)
  • 查询深度关系(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
    2
    match (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
drop index 索引名字

参考:https://python.iitter.com/other/191720.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!