2016-11-21 77 views
0

我想打一個查詢,查找包含所有成分的用戶通過(一個未知量)的食譜。暗號:基於多個關係找到節點屬性

我可以基於一種成分與此查詢查找菜譜:

MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'}) 
RETURN r 

例如,我如何才能找到含有下列各成分的所有配方;胡蘿蔔,菠蘿,芹菜,番茄,生薑?

回答

3

代表所需的成份列表,並使用ALL謂詞來檢查配方具有列表中的所有成分。訣竅是,只要你不引入新的變量,你可以使用patterns in conditions

所以,模式不僅是表達式,它們也是謂詞。對您的模式的唯一限制是您必須能夠以單一路徑表達它。像在MATCH中一樣,不能在多個路徑之間使用逗號。您可以通過將多個模式與AND結合來實現相同的效果。

請注意,您不能在這裏引入新的變量。 [...]

該查詢返回每一個有你列出的所有成分的配方:

MATCH (r:Recipe) 
WHERE ALL(
    ingredient IN ['carrot', 'pineapple', 'celery', 'tomato', 'ginger'] 
    WHERE (r)-[:CONTAINS]->(:Ingredient {name: ingredient}) 
) 
RETURN r 

我猜你會通過用戶輸入的參數:

MATCH (r:Recipe) 
WHERE ALL(
    ingredient IN { ingredients } 
    WHERE (r)-[:CONTAINS]->(:Ingredient {name: ingredient}) 
) 
RETURN r 
1

如果您安裝了3.1版本的APOC library的,你可以使用apoc.coll.containsAll功能。例如:

MATCH (r:Recipe)-[:CONTAINS]->(ing:Ingredient) 
WITH r, COLLECT(ing.name) AS names 
WHERE apoc.coll.containsAll(names, {ingredients}) 
RETURN r; 

(如果您安裝了3.0版本的庫,apoc.coll.containsAll將是一個程序,和上面的查詢將不得不進行相應的修改)

相關問題