[英]Neo4j NodeJS - Create Optional 1 to Many Relationships for Existing Nodes
[英]Neo4j delete a nodes existing relationships and create new relationship
我想要一个查询,该查询将从特定节点中删除所有现有关系,然后创建一个新关系。 这是我到目前为止所拥有的:
MATCH (m:Movie {
_id: 'test/55de0539eb1e14f26a04'
})
MATCH (existingNode:Person {
_id: 'test/41126fc03289a05d8621'
})
MATCH (existingNode)-[existingRelationships]->()
DELETE existingRelationships
WITH existingNode, m
CREATE (existingNode)-[:ACTED_IN]->(m)
RETURN existingNode;
当现有节点至少有一个现有关系时,这就像我想要的那样工作。 但是,如果在我运行此查询时现有节点的现有关系为零,则不会创建新关系。 如果没有要删除的内容,就好像在运行 DELETE 语句之后什么都没有。
即使没有要删除的内容,我如何链接 CREATE?
尝试使用OPTIONAL
和distinct
。
解释:根据 neo4j 的基数概念,如果我们有多个匹配项,我们将为每个匹配项获得一行。 因此,如果有多个节点连接到existingNode
,我们将得到多行结果,每个连接的节点对应一个。 existingNode
将在所有节点中重复,从而导致有关它的后续步骤被复制。 在我们的例子中,新的连接步骤将被执行多次。
如果没有OPTIONAL
,如果有零个节点连接到它,我们将得到零行,这是另一个问题。
因此,当使用OPTIONAL
时,在DELETE
步骤之后,我们有多个existingNode
,作为existingRelationships
的数量,但至少有一个,这要归功于OPTIONAL
。 我们仍然需要使用distinct
来避免与m
建立多个关系:
MATCH (existingNode:Person {
key: 'A'
})
WITH existingNode
OPTIONAL MATCH (existingNode)-[existingRelationships]->()
DELETE existingRelationships
WITH distinct existingNode as existingNode
MATCH (m:Movie {key: 'B'})
WITH existingNode, m
CREATE (existingNode)-[:ACTED_IN]->(m)
RETURN existingNode, m
它适用于具有要删除的关系的示例数据:
MERGE (a:Person{key: 'A'})
MERGE (b:Movie{key: 'B'})
MERGE (c:Node{key: 'C'})
MERGE (d:Node{key: 'D'})
MERGE (e:Node{key: 'E'})
MERGE (a)-[:POINTS]-(c)
MERGE (a)-[:POINTS]-(d)
MERGE (a)-[:POINTS]-(e)
还有一个没有关系要删除的:
MERGE (a:Person{key: 'A'})
MERGE (b:Movie{key: 'B'})
对于这两种情况,它都会返回:
╒══════════════╤═══════════╕
│"existingNode"│"m" │
╞══════════════╪═══════════╡
│{"key":"A"} │{"key":"B"}│
└──────────────┴───────────┘
解决方案是在删除之前使用可选匹配,例如
MATCH (m:Movie {
_id: 'test/55de0539eb1e14f26a04'
})
MATCH (existingNode:Person {
_id: 'test/41126fc03289a05d8621'
})
OPTIONAL MATCH (existingNode)-[existingRelationships]->()
DELETE existingRelationships
WITH existingNode, m
CREATE (existingNode)-[:ACTED_IN]->(m)
RETURN existingNode;
我相信 Neo4j 的行为是在任何 MATCH 语句未能返回任何项目时中断查询。 OPTIONAL MATCH 允许查询继续,即使没有项目匹配:
https://neo4j.com/docs/cypher-manual/current/clauses/optional-match/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.