2015-08-08 40 views
2
訂購的同級別的節點

我是新來Neo4j,目前這種樹狀結構玩:暗號:由物業上的關係

enter image description here

在黃色方框中的數字是一對關係命名order財產CHILD_OF

我的目標是

a)至通過此屬性,而不是通過直接的關係管理在同一水平的節點的排列順序(像例如LEFTRIGHTIS_NEXT_SIBLING,等等)。

b)能夠使用普通整數代替order屬性的完整路徑(即不保留諸如0001.0001.0002之類的東西)。

我卻無法找到它是如何,或者如果可能的遞歸查詢的圖形,使其不斷返回節點depth-first正確的提示,但在每個級別的排序考慮對關係order財產。

我認爲如果可能的話,它可能會包括將迭代的完整路徑與集合實用程序Cypher進行匹配,但我甚至沒有足夠接近以發佈一些好的起點。

問題

我從答案有什麼期望這個問題不一定是一個解決方案,但是否這樣的提示是,將執行不好反正個不錯的辦法。在Cypher方面,如果有實際的解決方案,我很感興趣。

我對如何將它作爲一個Neo4j服務器插件與Java遍歷或核心api(這並不意味着它會表現良好,但這是另一個話題)有個大致的想法,所以這個問題真的是目標設計和Cypher方面。

回答

1

這可能會實現:

match path = (n:Root {id:9})-[:CHILD_OF*]->(m) 
WITH path, extract(r in rels(path) | r.order) as orders 
ORDER BY orders 

如果抱怨數組排序,然後計算數,其中每個數字(或2個位數)是您的訂單和訂單被這個數字

match path = (n:Root {id:9})-[:CHILD_OF*]->(m) 
WITH path, reduce(a=1, r in rels(path) | a*10+r.order) as orders 
ORDER BY orders 
+0

謝謝,邁克爾。快速嘗試第一個查詢產生語法錯誤,而第二個查詢似乎工作。我現在無法詳細測試它,但會在一週內重新審視,然後批准答案或回覆評論。 – sthzg

+0

修復了第一個查詢 –

+0

抱歉等了很長時間纔回復。對於第一個查詢抱怨比較多個深度(不能從左到右比較,例如'[1,1]'到'[1]'),你是對的。第二種方法是有效的,但除非我讀到錯誤,否則似乎不會返回「深度優先」而是「寬度優先」的結果,例如, '[11],[12],[111],[112],...,[1112]'。 – sthzg