1

ノード (twitter ユーザー) と有向エッジ (フォロー) の埋め込みグラフ db があります。

指定されたユーザー (ノード U) がフォローしているユーザー (セット A) 間のすべての関係を取得しようとしています。Aまた、 のノードと指定された node の間の関係U

私のクエリ:

START u=node:user_id(user_id={id_of_U})
MATCH p = u-->following, p2= following-[?]->u, p3 = following-[?]->()<--u
RETURN distinct rels(p),rels(p2),rels(p3) 

このクエリは私が期待するものを提供しますが、問題は、指定されたユーザーがあまりにも多くのユーザーをフォローしている場合、非常に時間がかかることです.

多くのクエリを試しましたが、上記のクエリがこれまでで最高のクエリです。しかし、これを行うためのより効率的な方法があると確信しています。なぜなら、「A」のすべてのユーザーをウォークスルーし、それぞれのすべての関係 (Direction.BOTH) を取得してから、Java メソッドでこれらの関係を取得するからです。 「A」でリレーションシップをフィルタリングする (「A」に属さない開始ノードまたは終了ノードを持つリレーションシップを削除する) と、ユーザーが 500 人をフォローするのにわずか 8 秒しかかかりませんが、サイファー クエリは、ヒープを爆破することなく失敗することさえありません。 ...

4

2 に答える 2

0

最初p = u-->followingは最適ではありません。関連するすべてのノードが必要になり、後でこれらのノードでフィルタリングしようとするためです。ピックアップするノードを減らし、後でこのセットを少し拡張することをお勧めします。

START u=node:user_id(user_id={id_of_U})
MATCH u-[:FOLLOWS]->following
WITH u,following
MATCH u-[r]-following
RETURN distinct r;

これにより、ノードUが続くsetA内のノード間のすべての関係が得られます。

グラフにFOLLOWの関係がない場合は、そうする必要があります。そうでない場合、グラフの設計は最適ではありません。クエリで特定のrelタイプを使用していないことに気付きました。これは、データにリレーションシップタイプが1つしかない場合にのみ最適です。私があなたの質問を理解している限り、あなたは1つ以上のrelタイプを手に入れました。

編集:

START u=node:user_id(user_id={id_of_U})
MATCH u-[]-following
WITH u, following
MATCH u-[r]-again, again-[r2]-following
RETURN r, r2
于 2013-02-04T13:06:34.467 に答える
0

これを試してみませんか?

start u=node:user_id(user_id={id_of_U})
MATCH u-[r]->following
with u, r, following
match following-[r2?]->u, following-[r3?]->()<-[r4]-u
RETURN distinct r, r2, r3, r4

また、最新の 1.9 を使用していますか?

于 2013-02-04T04:49:12.727 に答える