0

ユーザーが形成するイベントの履歴を表すノードのリストがあり、次のパターンがあります。

()-[:s]->()-[:s]->()等々

リストの各ノードはユーザーに属します (関係を介して接続されます)。

個々のユーザー履歴を作成しようとしています (特定のユーザーに対して発生したすべてのイベント間に :succeeds_for_user 関係を追加し、各イベントに連続するイベントが 1 つだけになるようにします)。

関係にあるはずのノードを抽出するために、次のようなことをしようとしていました:

start u = node:class(_class = "User")
match p = shortestPath(n-[:s*..]->m), n-[:belongs_to]-u-[:belongs_to]-m
where n <> m
with n, MIN(length(p)) as l
match p = n-[:s*1..]->m
where length(p) = l  
return n._id, m._id, extract(x IN nodes(p): x._id)

しかし、それは痛いほど遅いです。

誰かがそれを行うためのより良い方法を知っていますか?

4

1 に答える 1

1

Neo4j はそこで多くの最短経路を計算しています。

履歴開始ノードがあると仮定すると (クエリの目的で ID x を使用)、次のように対応するユーザー ID を持つイベント ノードの順序付きリストを取得できます。

"START n=node(x) # history start
 MATCH p = n-[:FOLLOWS*1..]->(m)<-[:DID]-u  # match from start up to user nodes
 return u._id,
     reduce(id=0, 
            n in filter(n in nodes(p): n._class != 'User'): n._id) 
     # get the id of the last node in the path that is not a User 
     order by length(p) # ordered by path length, thus place in history"

次に、プログラムで結果を繰り返し、同じユーザーに属するノード間の関係を追加できます。適切な大きなデータセットはありませんが、高速になる可能性があります。

于 2013-06-11T20:33:06.770 に答える