让我们以这个例子为例:我有一个凶手相杀的数据集。我们有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”关系。在执行删除之后,任一节点可能都没有正确的传入“杀死”或传出“杀死”关系。仅在这种情况下,即当传入和传出都等于0时,我想从数据库中删除该节点。
删除关系后,我要为参与该关系的两个节点执行“ IF node.out_relationship.count = 0且node.in_relationship.count = 0,然后DELETE节点”。换句话说,我想在节点上执行一些后关系删除工作。
我正在考虑按以下方式增强我的查询:
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)
(显然,我可以将查询分解为其他会话,但是我认为将所有内容都保留在一个会话中,重新使用该节点会更有效。)
无论如何,我不确定这种改变有多大意义,看起来很难看,而且感觉就像我在向后弯腰。
我如何继续?我将不胜感激任何帮助。谢谢。
答案 0 :(得分:0)
由于您对凶手1和凶手2的逻辑是相同的,因此,如果为两个凶手创建一个2元素列表,然后将它们取消缠绕为单个变量,则可以一次将逻辑应用于两个人。
此密码为:
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(在过滤后的2个凶手的:KILLED度为0的集合上),并在那里进行DETACH DELETE,而不是使用UNWIND。
我不完全确定neo4jclient会如何表示,但这应该是您可以用来解决该问题的蓝图。