neo4j创建子节点并将其链接到另一个子节点
意图: 使用neo4j,我想将子节点添加到父节点。如果存在其他现有子项,我必须将该子项链接到所有兄弟姐妹 我的尝试: 假设我们确实知道父对象存在。我们想在它下面添加通用节点。我得到了这个并修改了它: 问题描述: 如果我多次运行查询,会发生以下情况:neo4j创建子节点并将其链接到另一个子节点,neo4j,cypher,Neo4j,Cypher,意图: 使用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)
...