Neo4j 密码链表:如何取消移位并替换为索引

Neo4j 密码链表:如何取消移位并替换为索引,neo4j,cypher,Neo4j,Cypher,我正试图按照此处的建议,使用Neo/Cypher创建一个链表结构: 但是我在理解所需事件序列的语法时遇到了困难,无法将新节点取消移动到结构上,或者用不同的节点替换特定的索引 我感到困惑的是,我需要添加新节点并修复使旧节点仍在链表结构中的结构。源于父节点的每种类型(PARENTID_RELTYPE)应该只有一个关系;但每个父级可以有多个不同类型的关系。子节点可以在LinkedList中多次显示,并且子节点可以在多个父节点的LinkedList中显示,也可以在同一父节点但关系类型不同的LinkedL

我正试图按照此处的建议,使用Neo/Cypher创建一个链表结构:

但是我在理解所需事件序列的语法时遇到了困难,无法将新节点取消移动到结构上,或者用不同的节点替换特定的索引

我感到困惑的是,我需要添加新节点并修复使旧节点仍在链表结构中的结构。源于父节点的每种类型(PARENTID_RELTYPE)应该只有一个关系;但每个父级可以有多个不同类型的关系。子节点可以在LinkedList中多次显示,并且子节点可以在多个父节点的LinkedList中显示,也可以在同一父节点但关系类型不同的LinkedList中显示

因此,当我尝试取消换档时,可能会发生以下三种情况之一:

  • 没有通过PARENTID\u RELTYPE链接到父级的现有子级

  • 已存在一个子节点,该节点通过PARENTID\u RELTYPE链接到父节点

  • 已经存在一个子节点,该子节点通过PARENTID_RELTYPE链接到父节点,并且该子节点只是我尝试取消移动到链表结构上的子节点的副本(在这种情况下,预期结果是在链表的零索引和第一索引中具有相同的子节点)

  • 上面提到的答案url极大地帮助我理解如何在Neo/Cypher中读取链表结构,但由于在Cypher中处理条件的另一种方式,我很难理解如何写入结构(以及从结构中删除)

    下面是我第一次尝试这样做,但我对我需要的语法有点困惑

    MATCH (a:%s {id: {_parentnodeid}}), (b:%s {id: {_id}})
    MERGE  a-[relold:%s]->b
      ON CREATE
         SET relold.metadata = {_metaData}
      ON MATCH
         ...
    

    我非常感谢您提供的帮助。

    如果我正在跟踪,您的节点可能属于多个链接列表。简单的“下一个”关系是不够的,因为当列表交叉时——共享一个子节点——“下一个”关系将拖入两个列表的所有下游节点。因此,通过添加父节点的id,可以使“下一个”关系对每个列表都是唯一的。(注意:使用元数据id可能会导致后续问题。)

    因此,您可能有一个id为1的父p1,一个唯一的关系“n_p1”来链接其子项,以及一个要添加的id为21的子项“c”

    对于没有子对象的父对象,您可以通过以下方式添加新子对象:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c
    
    如果父项有一个或多个子项,则查找与要添加的子项不同的最后一个子项:

    MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c
    
    其他人可能有更好的方法,但你可以把它们结合在一起。记住,联合的各个部分必须返回相同的列,所以只需返回新的子c。整个事情可能是这样的:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c return c UNION MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c return c; 
    

    如果我在跟踪,您的节点可能属于多个链接列表。简单的“下一个”关系是不够的,因为当列表交叉时——共享一个子节点——“下一个”关系将拖入两个列表的所有下游节点。因此,通过添加父节点的id,可以使“下一个”关系对每个列表都是唯一的。(注意:使用元数据id可能会导致后续问题。)

    因此,您可能有一个id为1的父p1,一个唯一的关系“n_p1”来链接其子项,以及一个要添加的id为21的子项“c”

    对于没有子对象的父对象,您可以通过以下方式添加新子对象:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c
    
    如果父项有一个或多个子项,则查找与要添加的子项不同的最后一个子项:

    MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c
    
    其他人可能有更好的方法,但你可以把它们结合在一起。记住,联合的各个部分必须返回相同的列,所以只需返回新的子c。整个事情可能是这样的:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c return c UNION MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c return c; 
    

    如果我在跟踪,您的节点可能属于多个链接列表。简单的“下一个”关系是不够的,因为当列表交叉时——共享一个子节点——“下一个”关系将拖入两个列表的所有下游节点。因此,通过添加父节点的id,可以使“下一个”关系对每个列表都是唯一的。(注意:使用元数据id可能会导致后续问题。)

    因此,您可能有一个id为1的父p1,一个唯一的关系“n_p1”来链接其子项,以及一个要添加的id为21的子项“c”

    对于没有子对象的父对象,您可以通过以下方式添加新子对象:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c
    
    如果父项有一个或多个子项,则查找与要添加的子项不同的最后一个子项:

    MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c
    
    其他人可能有更好的方法,但你可以把它们结合在一起。记住,联合的各个部分必须返回相同的列,所以只需返回新的子c。整个事情可能是这样的:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c return c UNION MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c return c; 
    

    如果我在跟踪,您的节点可能属于多个链接列表。简单的“下一个”关系是不够的,因为当列表交叉时——共享一个子节点——“下一个”关系将拖入两个列表的所有下游节点。因此,通过添加父节点的id,可以使“下一个”关系对每个列表都是唯一的。(注意:使用元数据id可能会导致后续问题。)

    因此,您可能有一个id为1的父p1,一个唯一的关系“n_p1”来链接其子项,以及一个要添加的id为21的子项“c”

    对于没有子对象的父对象,您可以通过以下方式添加新子对象:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c
    
    如果父项有一个或多个子项,则查找与要添加的子项不同的最后一个子项:

    MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c
    
    其他人可能有更好的方法,但你可以把它们结合在一起。记住,联合的各个部分必须返回相同的列,所以只需返回新的子c。整个事情可能是这样的:

    MATCH (c {id:21}), (p {id:1}) WHERE NOT p-[:n_p1]->() MERGE p-[:n_p1]->c return c UNION MATCH (c {id:21}), (p {id:1})-[:n_p1*1..5]->(cn) WHERE NOT cn-[:n_p1]->() AND NOT cn.id=c.id MERGE cn-[:n_p1]->c return c; 
    
    [更新]

    在以下查询中,为了简单起见,我假设:

    • 我们通过名称找到感兴趣的
      父节点
    • 当前兴趣的关系类型为
      Foo
    一般说明:

    • 可选匹配项