2015-08-17 38 views
3

圖形要點:http://gist.neo4j.org/?6182d024325343760cb4暗號COLLECT使您可在錯誤的順序放鬆

我想以一個(最長)路徑,它按預期工作,直到我添加一個收集說法,是有關於暗號的東西,收集我只是不明白,或者這是一個錯誤?

此查詢工作正常,返回節點路徑以正確的順序:

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port) 
OPTIONAL MATCH path=(port)-[:Connected_to*]-() 
WITH nodes(path) AS parts, length(path) AS len 
ORDER BY len DESC 
LIMIT 1 UNWIND parts AS part 
RETURN part 

這一個,沒有COLLECT語句,返回部分之間以正確的順序中的節點,而且節點父母(如預期)。

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port) 
OPTIONAL MATCH path=(port)-[:Connected_to*]-() 
WITH nodes(path) AS parts, length(path) AS len 
ORDER BY len DESC 
LIMIT 1 UNWIND parts AS part 
OPTIONAL MATCH (part)<-[:Has*1..10]-(parent) 
RETURN part, parent 

預期該查詢不起作用,返回節點在另一個爲了路徑:

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port) 
OPTIONAL MATCH path=(port)-[:Connected_to*]-() 
WITH nodes(path) AS parts, length(path) AS len 
ORDER BY len DESC 
LIMIT 1 UNWIND parts AS part 
OPTIONAL MATCH (part)<-[:Has*1..10]-(parent) 
RETURN part, LAST(COLLECT(parent)) 

任何有識之士將不勝感激。

回答

3

UNWIND實際上仍按照預期順序返回行。相反,它是聚合函數COLLECT(),它正在「重新排列」結果行。 neo4j不保證聚合函數的結果行將以任何特定順序(沒有ORDER BY子句)。

這是避免使用聚合的解決方法。它可能適用於您的特定用例,具體取決於您的要求。該查詢過濾第二個OPTIONAL MATCH,以便它包含最長可能的Has關係序列(只要最長序列是< = 10跳 - 您應該根據需要調整此參數,或考慮消除最大值)。查詢只是返回每個結果行中最遠的「祖先」,並且行將保持您期望的順序。

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port) 
OPTIONAL MATCH path=(port)-[:Connected_to*]-() 
WITH nodes(path) AS parts, length(path) AS len 
ORDER BY len DESC 
LIMIT 1 UNWIND parts AS part 
OPTIONAL MATCH (part)<-[:Has*1..10]-(ancestor) 
WHERE NOT (ancestor)<-[:Has]-() 
RETURN part, ancestor; 
+0

感謝您的解決辦法和解釋。 – Lundberg