Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何以独占方式查询与特定节点相关的节点_Neo4j_Cypher - Fatal编程技术网

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)