如何只查询与某些节点相关的节点

时间:2018-07-02 16:20:35

标签: neo4j cypher

我有一个图,其中包含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

这将返回我期望的SaladStirFry

有没有一种方法可以查询所有仅属于该集合的蔬菜? (在此示例中,仅是Veggies E,F,G和H)如果没有,或者确实很难做到,是否有更好的方法来构造此数据以使这种明显的关系更加明显?

2 个答案:

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