2017-12-13 10 views
0

私は現在、サッカーの試合データセットを使用しており、Cypherに最も多くの連続勝利をもたらしたチームを返そうとしています。Neo4j一覧連続

現時点では、リストを作成するcollectステートメント(​​)があります。ここで、'0'は損失を表し、'1'は勝利を表します。私は最も連続した勝利でチームを返そうとしています。ここで

は私のコードは、現時点では次のようになります。これは彼らの勝利を示す各チームのためのリストを返します

MATCH(t1:TEAM)-[p:PLAYS]->(t2:TEAM) 
WITH [t1,t2] AS teams, p AS matches 
ORDER BY matches.time ASC 
UNWIND teams AS team 
WITH team.name AS teamName, collect(case when ((team = startnode(matches)) AND (matches.score1 > matches.score2)) OR ((team = endnode(matches)) AND (matches.score2 > matches.score1)) then +1 else 0 end) AS consecutive_wins 
RETURN teamName, consecutive_wins 

/フォームでレコードを失う(すなわち[0,1,0,1,1,0]

どれ指導上で説明しましたまたは連続勝利の計算に関して助けが大いに評価されるであろう。

おかげ

答えて

1

は、私は同様の質問に答えhere

鍵は、0で分割するapoc.coll.split()を使用しています。これは、valueとして連続するストリーク(連続する1のリスト)あたりの行を生成します。

// your query above 
CALL apoc.coll.split(consecutive_wins, 0) YIELD value 
WITH teamName, max(size(value)) as consecutiveWins 
ORDER BY consecutiveWins DESC 
LIMIT 1 
RETURN teamName, consecutiveWins 
0

ご利用の場合は、実際には、ほとんどの連続した1秒の検出を必要としない(それも行います。リストのそれぞれのサイズは、これだけの最大サイズは、get、そのストリークのための連勝数ですUNWINDを使用する必要はありません)。

次のクエリは、直接各チームの連勝の最大数を(consWが連勝の現在の数を追跡し、そしてmaxWはこれまでに見つかった連勝数の最大値である)を計算するためにREDUCEを使用しています

MATCH (team:TEAM)-[p:PLAYS]-(:TEAM) 
WITH team, p 
ORDER BY p.time ASC 
WITH team, 
    REDUCE(s = {consW: 0, maxW: 0}, m IN COLLECT(p) | 
    CASE WHEN (team = startnode(m) AND (m.score1 > m.score2)) OR (team = endnode(m) AND (m.score2 > m.score1)) 
     THEN {consW: s.consW+1, maxW: CASE WHEN s.consW+1 > s.maxW THEN s.consW+1 ELSE s.maxW END} 
     ELSE s 
    END).maxW AS most_consecutive_wins 
RETURN team.name AS teamName, most_consecutive_wins;