neo4j - 如果关系 = 0,则在删除关系后删除节点
neo4j - delete node after deleting relationship if relationships = 0
让我们举个例子:我有一个数据集,里面有互相残杀的凶手。我们有 murderer-killed->murderer
.
neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")
现在,在我的应用程序中,我正在传递一些参数并删除两个节点之间的 'killed' 关系。执行删除后,任一节点可能没有传入 'killed' 或传出 'killed' 关系。仅在这种情况下,即当传入和传出都等于 0 时,我想从我的数据库中删除该节点。
删除关系后,我想对参与该关系的两个节点执行"IF node.out_relationship.count = 0 and node.in_relationship.count = 0, then DELETE node"。换句话说,我想在我的节点上执行一些 post-关系删除工作。
我想按如下方式增强我的查询:
neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")
.With("murderer1,murderer2")
.Match("(murderer1)-[:KILLED]-()")
.Where("count(murderer1)=0")
.Delete(murderer1)
.Match("(murderer2)-[:KILLED]-()")
.Where("count(murderer2)=0")
.Delete(murderer2)
(显然我可以将查询分解到其他会话中,但我认为将所有内容都放在一个会话中,重用节点会更有效率。)
不管怎样,我不确定这个改变有多大意义,它看起来很难看,感觉就像我在向后弯腰。
我该如何继续?我将不胜感激任何帮助。谢谢
由于您对 murderer1 和 murderer2 的逻辑是相同的,如果您为两个凶手创建一个 2 元素列表,然后将它们 UNWIND 到一个变量,您可以同时将该逻辑应用于他们两个。
密码为:
MATCH (murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
WHERE murderer1.Name = "someName"
AND murderer2.Name = "someName2"
DELETE k
WITH [murderer1, murderer2] as murderers
UNWIND murderers as murderer // now each on its own row under "murderer"
WITH murderer
WHERE size((murderer)-[:KILLED]-()) = 0
DETACH DELETE murderer // will delete any additional relationships
您也可以使用 FOREACH(在 :KILLED 度数为 0 的 2 个凶手的过滤集合上)并在那里执行 DETACH DELETE 而不是使用 UNWIND。
我不完全确定这将如何用 neo4jclient 表达,但这应该是您可以用来处理它的蓝图。
让我们举个例子:我有一个数据集,里面有互相残杀的凶手。我们有 murderer-killed->murderer
.
neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")
现在,在我的应用程序中,我正在传递一些参数并删除两个节点之间的 'killed' 关系。执行删除后,任一节点可能没有传入 'killed' 或传出 'killed' 关系。仅在这种情况下,即当传入和传出都等于 0 时,我想从我的数据库中删除该节点。
删除关系后,我想对参与该关系的两个节点执行"IF node.out_relationship.count = 0 and node.in_relationship.count = 0, then DELETE node"。换句话说,我想在我的节点上执行一些 post-关系删除工作。
我想按如下方式增强我的查询:
neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")
.With("murderer1,murderer2")
.Match("(murderer1)-[:KILLED]-()")
.Where("count(murderer1)=0")
.Delete(murderer1)
.Match("(murderer2)-[:KILLED]-()")
.Where("count(murderer2)=0")
.Delete(murderer2)
(显然我可以将查询分解到其他会话中,但我认为将所有内容都放在一个会话中,重用节点会更有效率。)
不管怎样,我不确定这个改变有多大意义,它看起来很难看,感觉就像我在向后弯腰。
我该如何继续?我将不胜感激任何帮助。谢谢
由于您对 murderer1 和 murderer2 的逻辑是相同的,如果您为两个凶手创建一个 2 元素列表,然后将它们 UNWIND 到一个变量,您可以同时将该逻辑应用于他们两个。
密码为:
MATCH (murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
WHERE murderer1.Name = "someName"
AND murderer2.Name = "someName2"
DELETE k
WITH [murderer1, murderer2] as murderers
UNWIND murderers as murderer // now each on its own row under "murderer"
WITH murderer
WHERE size((murderer)-[:KILLED]-()) = 0
DETACH DELETE murderer // will delete any additional relationships
您也可以使用 FOREACH(在 :KILLED 度数为 0 的 2 个凶手的过滤集合上)并在那里执行 DETACH DELETE 而不是使用 UNWIND。
我不完全确定这将如何用 neo4jclient 表达,但这应该是您可以用来处理它的蓝图。