2015-10-21 34 views
2

我有多個源自節點的關係。這些關係中的每一個都具有相同的標籤。這些關係指向一個子節點(不是唯一唯一的)。在我通過這個關係標籤獲取鏈接到父項的所有子節點後,我通過一個名爲trueindex的關係屬性對它們進行了排序。然後我有一系列節點,我的客戶端可以按照正確的排序順序進行迭代。CYPHER在創建時存儲同一標籤的節點關係的順序

問題出現在我試圖「推,彈出,不移等等......」到這個數組上。如果我想添加一個新的關係到訂單的前面,我必須創建一個新的關係,使用它將父項鍊接到子節點,然後向關係trueindex屬性添加一個0值。問題是已經存在與trueindex值爲零的關係,我需要執行一些casecading函數,以增加所有其他關係(全部來自同一父節點的相同類型)的trueindex。我試圖找到一種方法來獲得免費的「類似數組」的索引號功能

我認爲這樣做的唯一方法是首先刪除源於父級的特定標籤的所有關係。然後重寫整個數組(爲了反映正確的順序,使用所有預先存在的關係將它們的trueindex增加一)。這對於小案例來說很好,但是如果我計劃讓父節點擁有大量關係,那麼每次我想要添加,刪除索引,流行等時,都需要重寫整個數組(關係集)。但仍然保持源自父節點的關係的順序。

在創建新關係時,Neo4j是否有某種關係功能可以寫入正確的順序?

非常感謝您的建議,您可以提供。

回答

2

嘗試保持鏈接列表中的子節點。該結構將類似於

(p:Parent)-[r1:CHILDREN]->(c1:Child)-[r2:NEXT]->(c2:Child)-[r3:NEXT]->(c3:Child) 

這樣可保持你的孩子節點的順序,並允許您改善與結構之間的互動方式有兩種:

  1. 插入一個新的節點進入這個結構只涉及節點前往的地方「之前」和「之後」的關係的變化,而不是整個結構。例如,插入和c2newc之間c1,刪除r2,創建newc和創建c1newc:NEXT關係到c2。類似於其他操作:所有的改動現在都在結構中。

  2. 您使用關係及其類型來構造數據,而不是關係屬性。這是更靈活,幾乎總是更高性能(有時更高性能)。

要從此結構看一個孩子,你現在用你的trueindex申報的深度在該鏈表找到節點,即

MATCH (parent:Parent {parentId: 1234})-[:CHILDREN]->()-[:NEXT*3]->(child) 
RETURN child 

,並檢索其所有的孩子

MATCH (parent:Parent {parentId: 1234})-[:CHILDREN|NEXT*]->(child) 
RETURN parent, COLLECT(child) as children 
+0

如果一個孩子節點可以有多個父節點(即在同一個關係標籤的多個「數組」中有特徵),那麼如何管理:Next標籤以反映每個父母的數組的成員資格? –

+0

@BenjaminMcFerren當鏈接列表彼此交叉,即共享一個節點,然後標記每個唯一鏈表的NEXT關係時,可以爲每個鏈表保留父節點的id作爲NEXT的屬性。 –

+0

謝謝@ S.D。和jjaderberg。我現在試圖從你的建議中寫出一個不移位的查詢,但是我對條件部分有問題。我試過CASE,但它似乎只與RETURN或WITH具體值有關,而不是允許我在條件下執行CREATE。我試圖創建鏈接列表中的第一個鏈接,當這產生零結果:MATCH a- [rel:RELTYPE] - > b n.id = {_ parentnodeid},如果它產生1的結果,我想執行上面答案中描述的鏈接列表操作。非常感謝您對此的幫助 –

1

您可以使用SET遞增或第一現有關係的遞減特性父。

下面的例子轉移現有關係的trueIndex,並在索引0推的新關係(到現有的子節點):

MATCH (n:Root)-[r:HAS]->(c:Child) 
WHERE id(n) = 0 
SET r.trueIndex = r.trueIndex + 1 
WITH n, min(r.trueIndex) as indexStart, max(r.trueIndex) as indexEnd 
CREATE (n)-[r:HAS {trueIndex:(indexStart-1)}]->(c:Child) 
WHERE id(c) = 12 
RETURN n,r,c 

您可以根據自己的需要修改查詢。

明智的設計,我同意@jjaderberg的答案,保留一個鏈表來表示一個數組會更簡單。

相關問題