Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j创建子节点并将其链接到另一个子节点_Neo4j_Cypher - Fatal编程技术网

neo4j创建子节点并将其链接到另一个子节点

neo4j创建子节点并将其链接到另一个子节点,neo4j,cypher,Neo4j,Cypher,意图: 使用neo4j,我想将子节点添加到父节点。如果存在其他现有子项,我必须将该子项链接到所有兄弟姐妹 我的尝试: 假设我们确实知道父对象存在。我们想在它下面添加通用节点。我得到了这个并修改了它: 问题描述: 如果我多次运行查询,会发生以下情况: 创建一个新节点 创建新节点并将其与上一个节点链接 创建2个新节点,并将其中一个节点链接到现有节点和新创建的节点。我希望它只创建一个节点,并将其链接到所有其他节点 创建4个新节点,将其中一个节点连接到现有节点,并将其作为链连接。我希望只创建一个节点并

意图:

使用neo4j,我想将子节点添加到父节点。如果存在其他现有子项,我必须将该子项链接到所有兄弟姐妹

我的尝试:

假设我们确实知道父对象存在。我们想在它下面添加通用节点。我得到了这个并修改了它:

问题描述:

如果我多次运行查询,会发生以下情况:

  • 创建一个新节点
  • 创建新节点并将其与上一个节点链接
  • 创建2个新节点,并将其中一个节点链接到现有节点和新创建的节点。我希望它只创建一个节点,并将其链接到所有其他节点
  • 创建4个新节点,将其中一个节点连接到现有节点,并将其作为链连接。我希望只创建一个节点并链接到所有其他节点
  • 我不明白的是为什么要创建许多新节点?在
    FOREACH
    中,我认为
    (n)
    将引用同一个新创建的节点,而不是创建新节点

    • 添加新的兄弟姐妹并将其连接到所有其他兄弟姐妹(如果存在)的正确方法是什么
    • 有人能解释为什么这个会创建多个节点吗?在幕后发生了一些我不理解的事情

    我认为这可能会实现你想要实现的目标

    // Find the parent
    MATCH (tbl:Parent {name: "existing_node"})
    
    // Optionally fin existing children and put them in a collection    
    OPTIONAL MATCH (tbl)<-[:CHILD]-(c:Child {name: "generic_node"})
    WITH tbl, collect(c) AS children
    
    // create the new child and the relationship to the found parent
    CREATE (n:Child {name: "generic_node"})
    CREATE (tbl)<-[:CHILD]-(n)
    
    // create the sibling relationships to any pre-existing children
    FOREACH (c IN children |
      CREATE (c)-[:SIBLING]->(n)
    )
    
    //查找父对象
    匹配(tbl:Parent{name:“existing_node”})
    //(可选)为现有子项添加鳍并将其放入集合中
    
    可选匹配(tbl)我认为这可能实现您试图实现的目标

    // Find the parent
    MATCH (tbl:Parent {name: "existing_node"})
    
    // Optionally fin existing children and put them in a collection    
    OPTIONAL MATCH (tbl)<-[:CHILD]-(c:Child {name: "generic_node"})
    WITH tbl, collect(c) AS children
    
    // create the new child and the relationship to the found parent
    CREATE (n:Child {name: "generic_node"})
    CREATE (tbl)<-[:CHILD]-(n)
    
    // create the sibling relationships to any pre-existing children
    FOREACH (c IN children |
      CREATE (c)-[:SIBLING]->(n)
    )
    
    //查找父对象
    匹配(tbl:Parent{name:“existing_node”})
    //(可选)为现有子项添加鳍并将其放入集合中
    
    可选匹配(tbl)这应该满足您的要求(无论执行查询多少次,它都不会创建重复项):


    类似地,上面的
    MERGE(c)-[:SIBLING](n)
    子句也没有指定箭头,以确保在
    c
    n

    之间创建1且只有一个关系,这应该满足您的需要(无论执行查询多少次,它都不会创建重复项):


    类似地,上面的
    MERGE(c)-[:SIBLING]-(n)
    子句也没有指定箭头,以确保在
    c
    n
    之间创建1且只有一个关系,非常感谢。你介意详细解释一下为什么在集合上循环可以解决这个问题吗?顺便提一下,如果我循环匹配和循环匹配集合,虽然没有提到,但我注意到您也删除了“两个方向”。你的方法是正确的。事实证明,我不应该添加“双向”来表示相同的关系(或其补码),非常感谢。你介意详细解释一下为什么在集合上循环可以解决这个问题吗?顺便提一下,如果我循环匹配和循环匹配集合,虽然没有提到,但我注意到您也删除了“两个方向”。你的方法是正确的。事实证明,我不应该添加“双向”来表示相同的关系(或其补充)MERGE的良好用法。因为我是新手,我不知道你可以在一个行中连接一对多,所以我最终得到了一个FOREACH。MERGE的使用很好。因为我是新来的,我不知道你可以在一个班轮连接一对多,因此我最终与FOREACH。
    // Find the parent, p
    MATCH (p:Parent {name: "existing_node"})
    
    // Find or create Child, c, and ensure it is associated with p
    MERGE (c:Person {name: "generic_node"})
    MERGE (p)-[:HAS_CHILD]->(c)
    
    // Find each child of p (other than c), and ensure it has a `SIBLING` relationship with c
    WITH p, c
    MATCH (p)-[:HAS_CHILD]->(n)
    WHERE n <> c
    MERGE (c)-[:SIBLING]-(n)
    
    // Relationship pattern has no arrow, so matches relationship going in either direction
    MATCH (c1:Child)-[:SIBLING]-(c2:Child)
    ...