如何查找与起始节点列表相关的节点

时间:2017-09-22 12:18:06

标签: neo4j cypher

我有开始节点列表(Ingridients),我想找到所有配方,它们都有指定的ingridients(下面的代码示例)。 我正在尝试查找所有含有ingridient的食谱&Ingridient2' Ingridient3' Ingridient4'。

我使用此代码

MATCH result=(n:Ingridient)-[r:RELATED]->(m:Recipe)
  WHERE n.name IN ['Ingridient2', 'Ingridient3','Ingridient4']
RETURN result

但是这段代码返回的所有配方只包含一个Ingridient2或Ingridient3等。

我的问题是如何找到配方,包含指定的Ingridients。 还附带了示例http://console.neo4j.org/r/doxwy4

的链接
CREATE (Recipe1:Recipe {name:'Recipe1'})
CREATE (Recipe2:Recipe {name:'Recipe2'})
CREATE (Recipe3:Recipe {name:'Recipe3'})
CREATE (Recipe4:Recipe {name:'Recipe4'})

CREATE (Ingridient1:Ingridient {name:'Ingridient1'})
CREATE (Ingridient2:Ingridient {name:'Ingridient2'})
CREATE (Ingridient3:Ingridient {name:'Ingridient3'})
CREATE (Ingridient4:Ingridient {name:'Ingridient4'})
CREATE (Ingridient5:Ingridient {name:'Ingridient5'})

CREATE
  (Ingridient1)-[:RELATED]->(Recipe1),
  (Ingridient2)-[:RELATED]->(Recipe1),
  (Ingridient3)-[:RELATED]->(Recipe1)

CREATE
  (Ingridient2)-[:RELATED]->(Recipe2),
  (Ingridient3)-[:RELATED]->(Recipe2),
  (Ingridient4)-[:RELATED]->(Recipe2)

CREATE
  (Ingridient3)-[:RELATED]->(Recipe3),
  (Ingridient4)-[:RELATED]->(Recipe3),
  (Ingridient5)-[:RELATED]->(Recipe3)

1 个答案:

答案 0 :(得分:4)

这是一个Cypher,有评论,你想做什么。您可以使用WHERE ALL(...)对整个集合进行验证。

// Match all Recipe and their ingredients
MATCH (n:Ingridient)-[r:RELATED]->(recipe:Recipe)

// Collect ingredients into a collection
WITH COLLECT(n.name) as ingredients, recipe

// Filter where recipe uses all our ingredients
WHERE ALL(part in ['Ingridient2', 'Ingridient3','Ingridient4'] WHERE part IN ingridients)

// Return valid recipes
RETURN recipe