我有一个图,其中包含Fruit,Veggie和Dish节点类型,并带有一个[: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
这将返回我期望的Salad
和StirFry
。
有没有一种方法可以查询所有仅属于该集合的蔬菜? (在此示例中,仅是Veggies E,F,G和H)如果没有,或者确实很难做到,是否有更好的方法来构造此数据以使这种明显的关系更加明显?
答案 0 :(得分:3)
您已接近解决方案。您可以在第一种样式中match
蔬菜。 where
子句将删除不想要的菜肴。
match (d:Dish)<-[:in]-(v:Veggie)
where not ((v)-[:in]->(:Dish)<-[:in]-(:Fruit))
return v
输出将类似于:
╒═══════════════════╕
│v │
╞═══════════════════╡
│{name: Eggplant} │
├───────────────────┤
│{name: Horseradish}│
├───────────────────┤
│{name: Gord} │
├───────────────────┤
│{name: Fennel} │
└───────────────────┘
答案 1 :(得分:2)
您可以通过添加一个额外的MATCH
子句来继续您的查询:
MATCH (d:Dish)
WHERE NOT ((:Fruit)-[:in]->(d))
MATCH (veggie:Veggie)-[:in]->(d)
RETURN (veggie)