在我们的应用程序(java 8)中,我们使用NEO4J(3.4),对于功能,我们需要执行以下操作的查询:
将没有关系“ OWNS”的所有“ Team”类型的节点以及所有关系为“ MEMBER_OF”的“ Employee”类型的所有相关节点都删除为“ Team”,但前提是没有其他的Employee关系团队节点。
对于NEO4J 3.4版我是一个新手,并且对Cypher语言有一些基本的了解,但是现在我还不了解。
查询的第一部分:
MATCH (team:Team) WHERE NOT (team)-[:OWNS]->() RETURN team
并且我可以开始遍历结果集,等等。但是我敢打赌,有一个针对此问题的查询
答案 0 :(得分:2)
[已更新]
这可能对您有用:
MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
OPTIONAL MATCH (team)<-[:MEMBER_OF]-(emp:Employee)
WITH team, CASE
WHEN emp IS NULL THEN []
ELSE COLLECT({emp: emp, cnt: SIZE([(emp)--(t2:Team) WHERE team<>t2|t2])}) END AS data
DETACH DELETE team
FOREACH(e IN [d IN data WHERE d.cnt = 0 | d.emp] | DETACH DELETE e)
[更新2]
这是您自己答案的改进版本。关于节点标签和关系类型更明确,仅尝试删除一次team
。
MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
OPTIONAL MATCH (team)<-[:MEMBER_OF]-(emp:Employee)
WHERE SIZE((emp)--(:Team)) = 1
WITH COLLECT(emp) + team AS del
FOREACH(x IN del | DETACH DELETE x)
答案 1 :(得分:0)
我用
解决了MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
WITH team
OPTIONAL MATCH (team)-[r]-(allRelatedNodes)
WHERE size((allRelatedNodes)--()) = 1
DETACH DELETE team, allRelatedNodes
需要测试是否有更多数据,但这似乎可行