Neo4j 如何以独占方式查询与特定节点相关的节点
我有一个包含水果、蔬菜和菜肴节点类型的图表,其中一个关系类型为Neo4j 如何以独占方式查询与特定节点相关的节点,neo4j,cypher,Neo4j,Cypher,我有一个包含水果、蔬菜和菜肴节点类型的图表,其中一个关系类型为[:in],用于指示每个菜肴中包含哪些成分 示例数据: create (A:Ingredient:Fruit { name: "Apple" }), (B:Ingredient:Fruit { name: "Banana" }), (C:Ingredient:Veggie { name: "Cellery" }), (D:Ingredient:Veggie { name: "Daikon" }), (E:In
[:in]
,用于指示每个菜肴中包含哪些成分
示例数据:
create (A:Ingredient:Fruit { name: "Apple" }),
(B:Ingredient:Fruit { name: "Banana" }),
(C:Ingredient:Veggie { name: "Cellery" }),
(D:Ingredient:Veggie { name: "Daikon" }),
(E:Ingredient:Veggie { name: "Eggplant" }),
(F:Ingredient:Veggie { name: "Fennel" }),
(G:Ingredient:Veggie { name: "Gord" }),
(H:Ingredient:Veggie { name: "Horseradish" }),
(Salad:Dish { name: "Salad" }),
(FruitBowl:Dish { name: "FruitBowl" }),
(Platter:Dish { name: "Platter" }),
(StirFry:Dish { name: "StirFry" }),
(A)-[:in]->(FruitBowl),
(B)-[:in]->(FruitBowl),
(A)-[:in]->(Platter),
(B)-[:in]->(Platter),
(C)-[:in]->(Platter),
(D)-[:in]->(Platter),
(C)-[:in]->(Salad),
(D)-[:in]->(Salad),
(E)-[:in]->(Salad),
(F)-[:in]->(StirFry),
(G)-[:in]->(StirFry),
(H)-[:in]->(StirFry)
我想弄明白的是,如何查询只出现在只有蔬菜的菜肴中的蔬菜列表。我可以通过以下查询获得第一部分(仅包含蔬菜的菜肴列表):
match (d:Dish)
where not ((:Fruit)-[:in]->(d))
return d
这将返回我所期望的sala
和StirFry
有没有办法查询所有只属于该组的蔬菜?(在这个例子中,只有蔬菜E、F、G和H)如果没有,或者如果真的很难做到,是否有更好的方法来组织这些数据,使这种明显的关系更加明显?您接近解决方案。您可以
匹配第一种模式中的蔬菜。where
子句将删除不需要的菜肴
match (d:Dish)<-[:in]-(v:Veggie)
where not ((v)-[:in]->(:Dish)<-[:in]-(:Fruit))
return v
通过添加额外的MATCH
子句,您可以从开始的查询继续查询:
MATCH (d:Dish)
WHERE NOT ((:Fruit)-[:in]->(d))
MATCH (veggie:Veggie)-[:in]->(d)
RETURN (veggie)
然而,这返回了一些我不想要的蔬菜。Cellery在盘子里,盘子里也有一些水果。@slushpupie ok,编辑了限制,以防止蔬菜成为水果盘子的一部分。
MATCH (d:Dish)
WHERE NOT ((:Fruit)-[:in]->(d))
MATCH (veggie:Veggie)-[:in]->(d)
RETURN (veggie)