繁体   English   中英

Neo4j 删除节点现有关系并创建新关系

[英]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?

尝试使用OPTIONALdistinct

解释:根据 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM