NEO4J:父子类型筛选,它们共享相同的标签

NEO4J:父子类型筛选,它们共享相同的标签,neo4j,cypher,Neo4j,Cypher,我正在尝试解决如何返回包含以下内容的结果集: 父/子类型节点,子节点与父节点具有相同的标签,因此在主结果中是有效项 但如果子节点作为“子”匹配项包含,则应将其从主结果中排除 如果父项不包含子项,则应将其从主结果中排除 我可以让它大部分工作,但无法让第三点的工作令人满意 我的查询如下所示(已删除不相关的筛选): 更新日期:2015年5月26日: 下面的查询可以工作,但是有没有更好的方法来实现这一点,即在的WHERE和后续的可选匹配中没有重复 MATCH (f:Fruit),(tof:TypeO

我正在尝试解决如何返回包含以下内容的结果集:

  • 父/子类型节点,子节点与父节点具有相同的标签,因此在主结果中是有效项
  • 但如果子节点作为“子”匹配项包含,则应将其从主结果中排除
  • 如果父项不包含子项,则应将其从主结果中排除
我可以让它大部分工作,但无法让第三点的工作令人满意

我的查询如下所示(已删除不相关的筛选):

更新日期:2015年5月26日:

下面的查询可以工作,但是有没有更好的方法来实现这一点,即在
的WHERE
和后续的
可选匹配中没有重复

MATCH (f:Fruit),(tof:TypeOfFruit)
WITH f, tof
MATCH (f)-[:IS_BANANA|IS_APPLE]->(tof)
WHERE ((tof)<-[:IS_BANANA]-(f)-[:IN_FRUIT_SALAD]->(:Fruit)-[:IS_APPLE]->(tof)) OR ((tof)<-[:IS_APPLE]-(f) AND NOT (f)<-[:IN_FRUIT_SALAD]-())
OPTIONAL MATCH (tof)<-[:IS_BANANA]-(f)-[r:IN_FRUIT_SALAD]->(f1:Fruit)-[:IS_APPLE]->(tof)
WITH DISTINCT f, COLLECT(DISTINCT f1) AS f1
RETURN { fruit : f, fruitSaladComponents : f1 }
匹配(f:水果),(tof:水果类型)
用f,tof
匹配(f)-[:是香蕉还是苹果]->(豆腐)
式中((tof)(:Fruit)-[:IS_APPLE]->(tof))或((tof)溶液如上所述(稍微改变WHERE子句)-

匹配(f:水果),(tof:水果类型)
用f,tof
匹配(f)-[:是香蕉还是苹果]->(豆腐)
可选搭配(tof)(f1:水果)-[:是苹果]->(tof)
使用不同的f、tof,收集(不同的f1)作为f1

其中((tof)(:Fruit)-[:IS_APPLE]->(tof))或((tof)Plz通过共享示例图。@StefanArmbruster-link已添加。提前感谢。
MATCH (f:Fruit),(tof:TypeOfFruit)
WITH f, tof
MATCH (tof)<-[:IS_BANANA]-(f)-[:IN_FRUIT_SALAD]->(f1:Fruit)-[:IS_APPLE]->(tof)
WITH DISTINCT f, COLLECT(DISTINCT f1) AS f1
RETURN { fruit : f, fruitSaladComponents : f1 }
UNION
MATCH (f:Fruit),(tof:TypeOfFruit)
WITH f, tof
MATCH (f)-[:IS_APPLE]->(tof)
WHERE NOT (f)<-[:IN_FRUIT_SALAD]-()
WITH DISTINCT f,[] AS f1
RETURN { fruit : f, fruitSaladComponents : f1 }
MATCH (f:Fruit),(tof:TypeOfFruit)
WITH f, tof
MATCH (f)-[:IS_BANANA|IS_APPLE]->(tof)
WHERE ((tof)<-[:IS_BANANA]-(f)-[:IN_FRUIT_SALAD]->(:Fruit)-[:IS_APPLE]->(tof)) OR ((tof)<-[:IS_APPLE]-(f) AND NOT (f)<-[:IN_FRUIT_SALAD]-())
OPTIONAL MATCH (tof)<-[:IS_BANANA]-(f)-[r:IN_FRUIT_SALAD]->(f1:Fruit)-[:IS_APPLE]->(tof)
WITH DISTINCT f, COLLECT(DISTINCT f1) AS f1
RETURN { fruit : f, fruitSaladComponents : f1 }
MATCH (f:Fruit),(tof:TypeOfFruit)
WITH f, tof
MATCH (f)-[:IS_BANANA|IS_APPLE]->(tof)
OPTIONAL MATCH (tof)<-[:IS_BANANA]-(f)-[r:IN_FRUIT_SALAD]->(f1:Fruit)-[:IS_APPLE]->(tof)
WITH DISTINCT f, tof, COLLECT(DISTINCT f1) AS f1
WHERE ((tof)<-[:IS_BANANA]-(f)-[:IN_FRUIT_SALAD]->(:Fruit)-[:IS_APPLE]->(tof)) OR ((tof)<-[:IS_APPLE]-(f) AND NOT (f)<-[:IN_FRUIT_SALAD]-())
RETURN { fruit : f, fruitSaladComponents : f1 }