0

暗号クエリと複数の一致では得られないことがあります。

環境 :

target = node(2145) = アプリのビデオ ゲーム

me = node(2570) = ログインしているユーザー

指定されたターゲットとやり取りしたすべてのユーザー (私を含む) を取得しようとしています。さらに、これらのユーザーを自分との距離で並べ替えたい...

すなわち、目標は、ビデオ ゲームを操作したユーザーを表示することです。つまり、最初に私と私の友人、次に他のユーザーです。

私のクエリ:

START target=node(2145), me=node(2570)
MATCH (target)-[:INTERACTIONS]->()<-[:IS_TARGET_OF]-(interactions)<-[:IS_SOURCE_OF]-()<-[:INTERACTIONS]-(users)
WITH me, users
MATCH p = (users)-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(me)
RETURN users, MIN(LENGTH(p)) as conn
ORDER BY conn ASC

問題 :

ターゲットとやり取りしたのは私だけであることを考えると、2570 という 1 つの結果が得られるはずです。

私が抱えている問題は、返されたユーザーに「私」が表示されないことです。クエリは何も返しません

私が試したこと:

  • 最初の MATCH の直後に RETURN すると、2570 という 1 つの結果が得られます。
  • 2 番目の一致で、p = (users)-[*0..3]-(me) を試すと、1 つの結果 2570 も得られます。

  • クエリの 2 番目の部分のみを使用して、次のことを試した場合:

    START me=node(2570), users=node(2570, 2802)
    MATCH p = me-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(users)
    RETURN users, MIN(LENGTH(p)) as conn
    ORDER BY conn ASC
    

    私は 2570 と 2802 を取得します (彼は私の友人なので)。

ここで何か間違ったことをしていると確信していますが、何がわかりません..どうすれば問題を解決できるか分かりますか?

ありがとう、

4

1 に答える 1

1

あなたの実験に関しては、2 番目のパターン マッチは「開始」で適切に機能します。したがって、次のように 2 番目の一致と最初の一致を接続詞として組み合わせることができます。

START target=node(2145), me=node(2570)
MATCH (target)-[:INTERACTIONS]->()<-[:IS_TARGET_OF]-(interactions)<-[:IS_SOURCE_OF]-()<-[:INTERACTIONS]-(users), p = (users)-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(me)
RETURN users, MIN(LENGTH(p)) as conn
ORDER BY conn ASC  

結果としてノード「me」が返されます。

2番目のパターンがWith句でうまくいかない理由としては、「users」と「me」が同じノードを参照する場合、パターンがこのようになることが問題だと思います。

(私)-[:連絡先]->(x)<-[:連絡先]-(私)

このようなパターンに合わせるには、「私」から始まり、同じ関係をたどって「私」に戻る必要がありますが、同じ関係をたどる必要はありません。したがって、「me」と「users」が同じ場合、「me」は 2 番目のパターンと一致しません。

「start」句で機能する理由について、私の推測では、指定された 2 つの終点「users」と「me」から別々に開始する 2 つのトラバースがあり、2 つが途中で合流してパターンをテストします ()- [?:IS_FRIEND_WITH*0..3]-() であり、2 つの別々のトラバースであるため、同じリレーションシップをもう一度トラバースする問題はありません。

于 2013-10-31T16:36:08.400 に答える