【问题标题】:how do I delete duplicate relationships between two nodes with cypher?如何使用密码删除两个节点之间的重复关系?
【发布时间】:2013-08-14 15:53:33
【问题描述】:

当我运行这个查询时:

START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r

它为我提供了两个节点之间的重复关系列表。我应该在密码查询中添加什么来迭代关系以保留一个关系并删除其余关系?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    对两个已知节点执行此操作:

    start n=node(1), m=node(2) match (n)-[r]->(m) 
    with n,m,type(r) as t, tail(collect(r)) as coll 
    foreach(x in coll | delete x)
    

    为所有关系全局执行此操作(请注意,此操作可能非常昂贵,具体取决于您的图表的大小):

    start r=relationship(*) 
    match (s)-[r]->(e)
    with s,e,type(r) as typ, tail(collect(r)) as coll 
    foreach(x in coll | delete x)
    

    【讨论】:

    • 在最近的 neo4j 版本中,我认为 START 子句是不必要的,对吧?没有它似乎也一样。
    • 直到我意识到tail 返回除第一个元素之外的所有元素之前,我才明白它是如何工作的。谢谢!
    • 我想知道您在哪里找到了您使用的“关系”功能?我在任何地方的文档中都没有看到它,只有“关系”。它是一个较旧的功能吗?
    • 这个很久以前就被删除了。现在,您只需省略第一行,并以 match 开头。
    【解决方案2】:

    使用 Neo4J 4.x 并全局删除重复关系,您需要改用以下内容。语法略有变化,其他回复中提到的start 前缀不再有效。

    match ()-[r]->() 
    match (s)-[r]->(e) 
    with s,e,type(r) as typ, tail(collect(r)) as coll 
    foreach(x in coll | delete x)
    

    【讨论】:

    • 注意,为什么是第一行? (我认为不需要) match ()-[r]->()
    • 为什么match ()-[r:RELTYPE]-() with type(r) as typ, tail(collect(r)) as coll foreach(x in coll | delete x); 不工作呢?为什么会删除该类型的所有关系?
    【解决方案3】:

    如果您对从数据库中删除数据的随机查询有信任问题,您可以按照我的做法进行操作。

    首先,您可能想要检查所选关系是否真的重复。此查询会将属性 willBeDeleted 设置为 true,因此您可以检查是否真的要删除它们。

    match (a)-[r]->(b) 
    with a,b,type(r) as typ, tail(collect(r)) as coll 
    foreach(x in coll | set x.willBeDeleted=true)
    

    现在您可以检查哪些关系将被实际删除。

    match(a)-[r]-(b)
    where r.willBeDeleted=true
    return a, b, r
    

    如果您认为正确的关系将被删除,那么您可以执行此查询以删除重复项。

    match (a)-[r]->(b) 
    with a,b,type(r) as typ, tail(collect(r)) as coll 
    foreach(x in coll | delete x)
    

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多