2015-01-07 90 views
1

我有兩個密碼查詢,並想知道是否有可能在一個單一的語句內獲得Points和HeadHunter信息。可能結合這兩個查詢

MATCH (s:SEASON)-[*]->(e:EVENT)<-[f:FINISHED]-(p:PLAYER) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(f.points) AS Points 
    ORDER BY Points DESC 

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter 
    ORDER BY HeadHunter DESC 

我玩過不同的方法,但都沒有工作。我願做這樣的事情:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points 

回答

3

這是否適合您?

MATCH (s:SEASON)-[*]->(e:EVENT)<-[rel:FINISHED|ELIMINATED]-(p:PLAYER) 
WHERE s.id = 8 AND e.id <= 1197 
WITH p, COLLECT(rel) AS rels 
RETURN p, 
    REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'FINISHED' THEN s + x.points ELSE s END) AS Points, 
    REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'ELIMINATED' THEN s + x.points ELSE s END) AS HeadHunter 

這應該返回每個完成和/或被淘汰的玩家的相關總和。

+0

看起來很有保證。我會在今天晚些時候嘗試解決方案,如果按預期工作,則會給您一個反饋。 – Richard

+0

我的使用案例的完美解決方案 - 謝謝。 – Richard

+0

不客氣。請也接受我的回答。 – cybersam

1

原則,我認爲你的查詢可以工作,但你可能已經犯了一個錯誤你p變量。在此查詢:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points 

注意p必須同時與ELIMINATED關係FINISHED關係的球員。我猜根據你的域名的語義,這是沒有道理的;你不能被淘汰並完成,對嗎?

所以,你可能想嘗試這方面的一些變種:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(pElim:PLAYER),(e)<-[f:FINISHED]-(pFinish) 
    WHERE s.id = 8 AND e.id <= 1197 
    RETURN pElim, sum(el.points) AS HeadHunter, pFinish, sum(f.points) AS Points 

注意這個,你就會有很多關於的pElimpFinish但各自的值應該是正確的各種組合輸出的額外行。

+2

該查詢只匹配既有ELIMINATED關係又有FINISHED關係的事件。雖然比原始查詢更好,但這可能仍然不合適。 – cybersam

+0

啊,所以OP在尋找'Event'對象的獨立性嗎?原始問題中的實際模型要求很模糊。 – FrobberOfBits

+0

對不起@FrobberOfBits如果我有點不清楚我的用例以及節點是如何'邏輯'連接的。我對所有圖形數據庫的東西都比較陌生,可能必須弄清楚哪些信息是相關的,以便我的問題無誤地提出。 – Richard