0

他のノードよりもいくつかのユーザーノードがあるとしましょう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 句を追加した瞬間、フォローしているユーザーの部分的なリストを再び取得し始めました。なぜこれが起こっているのですか?


うまくいくと思われる別の可能な解決策は、WITHand を使用すること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 の完全な表現力を失うようです。

4

1 に答える 1

1
START n=node(*)
MATCH following_all<-[:FOLLOWS]-n-[:FOLLOWS]->following_filter
WHERE following_filter.name='John'
RETURN n, COLLECT(following_all)
于 2013-07-07T07:12:22.597 に答える