Cypher查询以查找其相关实体是给定集合的子集的所有实体

时间:2013-12-03 08:05:23

标签: neo4j cypher graph-databases

我对图形数据库很陌生,过去几天只是弄乱了Neo4j。但是,我想要建立一个项目并在大门外撞墙。

说我们的域名是食谱和配料。我想问这个图是:“给我所有可以用给定的成分集合制作的食谱”。

以下是示例图http://console.neo4j.org/?id=4apn5q

在图表中,用户:HAVE成分和食谱:REQUIRE成分,但是为了简化而忽略用户方面是可以的。

有没有办法编写一个返回需要成分集合的食谱的查询,并且不需要任何不在集合中的成分?我是否正在考虑这个问题,还是有更好的方法来解决这个问题?我愿意接受任何见解。

谢谢。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

  • 从用户那里获取所有可用的成分
  • 获取每个食谱的所有成分列表
  • 比较清单

MATCH (u:User { name:'Keith' })-[:HAS]->(availableIngredient) 
WITH collect(availableIngredient) AS availableIngredients 
MATCH (r:Recipe)-[:REQUIRES]->(ingredient) 
WITH r, collect(ingredient) AS ingredients, availableIngredients 
WHERE ALL(x IN ingredients WHERE SINGLE (y IN availableIngredients WHERE x=y)) 
RETURN r, ingredients

由于您触摸了图表中的所有食谱,因此此查询非常贪婪。这可以通过从您的用户开始,遍历可用的成分并将配方限制为可从那里到达的那些来优化:

MATCH (u:User { name:'Keith' })-[:HAS]->(availableIngredient)<-[:REQUIRES]-(recipe:Recipe) 
WITH recipe, collect(availableIngredient) AS availableIngredients 
MATCH (recipe)-[:REQUIRES]->(ingredient) 
WITH recipe, availableIngredients, collect(ingredient) AS ingredients 
WHERE ALL (x IN ingredients WHERE SINGLE (y IN availableIngredients WHERE x=y)) 
RETURN recipe.name, ingredients