2017-02-21 6 views
0

私のデータは次のようにモデル化されています。各ノードのトップソートパターンを見つけよう

私はサッカー選手、ゴール、マッチのノードを持っています。プレイヤーは[:プレイした]リレーション、[:スコア]リレーションを持つゴールにマッチするように接続されています。目標は[:scoredIn]関係と一致するように接続されます。各一致に(長い)日付プロパティがあります。

私は最後の5試合で最も多くのゴールを決めた選手を見つけようとしています(match.dateプロパティでのDESCソート)。

最も効率的な方法は何でしょうか?私はすべての選手の試合をDESCでソートし、マッチIDを保持してから関連する試合に(プレイヤー) - [:得点] - >(ゴール) - [:scoredIn] - >(m)パターンを見つけることができます。非常に遅い。

私は何かが欠けているように見えますが、どうやってこれらのパターンを相対ソートで見つけることができますか?これは、プロファイルまたはあなたのクエリを説明し、(すべての要素が拡大して)あなたの説明に結果の計画をペーストするのを助けることができる

おかげ

+2

たちを表示しますあなたの 'slow'クエリ。 –

+0

これは以下のような答えになります... – user3008826

答えて

0

私はそれに刺し傷をつけて、私たちが最もトラバーサルに適したクエリを探しているように思えます。 1人のプレーヤーが多くのゴールを決めているかもしれませんし、それぞれのゴールを広げなければならないかもしれません。

代わりに、プレイヤーの最後の5試合を得て、その試合で得点を得て、プレイヤーに基づいたものを選別すれば、より効率的な場合があります。

ような何か:大規模なグラフで

MATCH (p:Player)-[:played]->(m) 
WITH p, m 
ORDER BY m.date DESC 
WITH p, COLLECT(m)[..5] as matches 
UNWIND matches as match 
MATCH (match)<-[:scoredin]-(g) 
WHERE (g)<-[:scored]-(p) 
RETURN p, COUNT(g) as goalsInLast5 
ORDER BY goalsInLast5 DESC 
LIMIT 10 // or whichever top n you want 

、これはまだ高価なクエリかもしれません。

小さな改善点として、目標ごとに1つのゴールノードではなく、プレーヤーごとのマッチごとに目標をグループ化することを検討してください。等

何か:

(プレイヤー) - [:スコア] - >(目標:ゴール{目標:4}) - [:scoredin] - >(一致)

+0

これは実際には私の「遅い」クエリです。各プレイヤーの最後の5試合を取得し、各プレイヤーの目標とソートを取得します。これは私の50,000試合のグラフで10〜12秒かかるので、私は何かが不足しているので、この目標を達成するためのよりよい方法があります.. – user3008826

+0

あなたはクエリをPROFILEしてあなたの説明に追加できますか? )? – InverseFalcon

関連する問題