2016-11-21 21 views
0

ユーザーが渡したすべての成分(未知量)を含むレシピを検索するクエリを作成したい。Cypher:複数の関係属性に基づいてノードを見つける

私はこのクエリで1つの成分に基づいてレシピを見つけることができます。たとえば

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.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手順だろう、と上記のクエリは、それに応じて変更する必要があります。)

関連する問題