2015-10-02 23 views
3

返回前n個結果對於每個查詢我一直想在扭動CYPHER查詢下面的任務,但我沒有得到正確的結果。其他計算器問題討論限制或收集,但我不認爲這是足以做下面的任務。在Neo4j的

任務: 我有(p:Product)節點,在兩個產品節點之間有一個叫做「BOUGHT_TOGETHER」的關係。那就是

(p:Product)-[b:BOUGHT_TOGETHER]-(q:Product) 

而關係b有一個名爲「size」的屬性,它包含一些數字。我想返回按尺寸排序的每個產品關係的前3個結果。例如,查詢結果應該如下所示。

+------------------------+ 
| p.id | q.id | b.size  | 
+------------------------+ 
    1  2  10 
    1  3  8 
    1  5  7 
    2  21  34 
    2  17  20 
    2  35  15 
    3  5  49 
    3  333  30 
    3  65  5 
    .  .  . 
    .  .  . 
    .  .  . 

有人可以告訴我如何編寫密碼查詢以達到預期的結果嗎?謝謝!

回答

1

這裏做一個方式(似乎應該有使用LIMIT的方式,但我不能想出一個剛纔)。

我生成具有

FOREACH (a IN [[1,2,10],[1,3,8],[1,5,7],[2,21,34],[2,17,20],[2,35,15],[3,5,49],[3,333,30],[3,65,5],[1,4,1],[3,6,100]]| MERGE (p:Product { id:a[0]}) 
    MERGE (q:Product { id:a[1]}) 
    CREATE p-[b:BOUGHT_TOGETHER { size:a[2]}]->q 
) 

這是從所需輸出的表中的數據,加上另外兩個項目的示例圖:[1,4,1][3,5,100]。有一些節點多於三個關係幫助我們測試,查詢得到了1正確的三個結果不應包含[1,4,1]3結果現在應該包含[3,6,100]而不是[3,5,5]

如果這是你的數據的準確樣本,那麼這個查詢應該做你想要什麼:

MATCH (p:Product)-[b:BOUGHT_TOGETHER]-(q:Product) 
WITH p.id AS pid, q.id AS qid, b.size AS bsize 
ORDER BY bsize DESC 
WITH pid, collect([qid, bsize])[..3] AS qb 
UNWIND qb AS uqb 
RETURN pid, uqb[0] AS qid, uqb[1] AS bsize 
ORDER BY pid, bsize DESC 

的想法是b.size下令所有的結果項,然後收集他們每p扔掉除了每個集合中的前三個項目,然後放鬆並返回。結果會不完全一樣的輸出表,因爲它包括在其他方向的關係,以及([5,1,7]以及[1,5,7]),但我認爲這是你無論如何都會想要什麼。

如果一切正常,你可能想看看你是否可以推遲閱讀關閉屬性,直到後已修整集合節省一些數據庫訪問。

3

另一個解決方案是一階的關係,管他們集合中的身心只集合的3個結果:

MATCH (p:Product)-[r:BOUGHT_TOGETHER]->(:Product) 
WITH p, r 
ORDER BY r.size DESC 
WITH p, collect(r) AS bts 
UNWIND bts[0..3] AS r 
RETURN p.uuid as pid, endNode(r).uuid as qid, r.size as size 

測試控制檯的位置:http://console.neo4j.org/r/r88ijn

注:後重新閱讀jjaderberg的答案這有點類似,只是我認爲更具可讀性。爲什麼我投他的答案。

+0

謝謝!有效! – user4279562

+0

很酷,請接受答案;-) –