ユーザーが渡したすべての成分(未知量)を含むレシピを検索するクエリを作成したい。Cypher:複数の関係属性に基づいてノードを見つける
私はこのクエリで1つの成分に基づいてレシピを見つけることができます。たとえば
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
、どのように私は、以下の成分のそれぞれを含むすべてのレシピを見つけるだろう。ニンジン、パイナップル、セロリ、トマト、ショウガ?
ユーザーが渡したすべての成分(未知量)を含むレシピを検索するクエリを作成したい。Cypher:複数の関係属性に基づいてノードを見つける
私はこのクエリで1つの成分に基づいてレシピを見つけることができます。たとえば
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.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
は手順だろう、と上記のクエリは、それに応じて変更する必要があります。)