查找和删除与其他节点不相关的相关节点

时间:2019-01-08 14:49:34

标签: neo4j cypher

在我们的应用程序(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

并且我可以开始遍历结果集,等等。但是我敢打赌,有一个针对此问题的查询

2 个答案:

答案 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

需要测试是否有更多数据,但这似乎可行