我对图形数据库很陌生,过去几天只是弄乱了Neo4j。但是,我想要建立一个项目并在大门外撞墙。
说我们的域名是食谱和配料。我想问这个图是:“给我所有可以用给定的成分集合制作的食谱”。
以下是示例图http://console.neo4j.org/?id=4apn5q
在图表中,用户:HAVE成分和食谱:REQUIRE成分,但是为了简化而忽略用户方面是可以的。
有没有办法编写一个返回需要成分集合的食谱的查询,并且不需要任何不在集合中的成分?我是否正在考虑这个问题,还是有更好的方法来解决这个问题?我愿意接受任何见解。
谢谢。
答案 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