他のノードよりもいくつかのユーザーノードがあるとしましょうFOLLOWS
。すべてのユーザーのリストと、フォローしているユーザーの完全なリストを読み込み、そのリストをフィルター処理して、特定のノードをフォローしているユーザーのみを取得したいと考えています。それを行う適切な方法は何ですか?
私の最初の試みは:
START n=node(*)
MATCH n-[:FOLLOWS]->following
WHERE following.name='John'
RETURN n, COLLECT(following)
ジョンを除いてフォローされているすべてのユーザーがフィルタリングされるため、これは明らかに機能しません。そのため、 COLLECT() には常にその単一のユーザーしかありません。
私の次の試みは、関連するノードを 2 回ロードすることでした。
START n=node(*)
MATCH n-[:FOLLOWS]->following_filter
, n-[:FOLLOWS]->following_all
WHERE following_filter.name='John'
RETURN n, COLLECT(following_all)
これは最初はうまくいくように見えましたが、それに別の MATCH 句を追加した瞬間、フォローしているユーザーの部分的なリストを再び取得し始めました。なぜこれが起こっているのですか?
うまくいくと思われる別の可能な解決策は、WITH
and を使用することANY
です。
START n=node(*)
MATCH n-[:FOLLOWS]->following
WITH n, COLLECT(following) AS following
WHERE ANY(x in following WHERE x.name='John')
RETURN n, COLLECT(following)
ただし、WITH
今のところ使用を避け、別の解決策を見つけることを好みます。私が作成したクエリ ビルダーを使用してこれらのクエリを生成していますが、これはまだ をサポートしていませんWITH
。そのサポートを追加するには、いくつかのアーキテクチャの変更が必要です。これには時間がかかります。を避けるのはあまり良い理由ではないことはわかっていWITH
ます。最終的にはそのサポートを追加しますが、今何かを機能させて、必要に応じて後で変更することを本当に好みます。
パターンを WHERE 句として使用することもできます。
START n=node(*), john=node(888)
MATCH n-[:FOLLOWS]->following
WHERE n-[:FOLLOWS]->john
RETURN n, COLLECT(following)
しかし、ID または lucene インデックスを使用して "John" ノードをロードすることしかできないようで、Cypher の WHERE の完全な表現力を失うようです。