我想打一個查詢,查找包含所有成分的用戶通過(一個未知量)的食譜。暗號:基於多個關係找到節點屬性
我可以基於一種成分與此查詢查找菜譜:
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何才能找到含有下列各成分的所有配方;胡蘿蔔,菠蘿,芹菜,番茄,生薑?
我想打一個查詢,查找包含所有成分的用戶通過(一個未知量)的食譜。暗號:基於多個關係找到節點屬性
我可以基於一種成分與此查詢查找菜譜:
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何才能找到含有下列各成分的所有配方;胡蘿蔔,菠蘿,芹菜,番茄,生薑?
代表所需的成份列表,並使用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
如果您安裝了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
將是一個程序,和上面的查詢將不得不進行相應的修改)