2017-02-23 71 views
0

我遇到了一個問題,我有我的圖形構造是這樣的:繼承財產 - 的Neo4j

  A 
     / \ 
     B  C 
    /\ /\ 
    D E F G 

我的所有節點都是Object類型:即匹配( N:對象) 我創造了這個圖形只有一個關係(父母和子女) 即(A)-[:child]->(B)(A)-[:child]->(C)(B)-[r:child]->D,等等,直到節點G

我在每個節點上定義的屬性稱爲:levelID 一些的節點可能沒有這個levelID。沒有levelID的節點應該從其父節點繼承。

現在,當我運行暗號(假設C和G不具有levelID):

MATCH (n1:Object)-[:child]->(n2:Object) 
return n2.id as id, 
CASE 
WHEN n2.levelId is null 
THEN n1.levelId //I am stuck here. (what if node C has levelID as null) 
ELSE n2.levelId 
END AS level 

這不是得到所需的輸出。

預期:(考慮C和G具有levelId = NULL)

id node  level 
1 A   1 
2 B   2 
3 C   1 
4 D   4 
5 E   5 
6 F   6 
7 G   1 

但是,這是我的實際:(

id node  level 
1 A   1 
2 B   2 
3 C   1 
4 D   4 
5 E   5 
6 F   6 
7 G   null 

回答

2

查找根節點,取路徑從根到節點,在此路徑中找到具有所需屬性的第一個節點:

// Find root 
MATCH (root:Object) WHERE NOT (:Object)-[:child]->(root) WITH root 

// Loop through nodes 
MATCH (n:Object) WITH n, root 

// The path from the root to the node 
MATCH path = (root)-[:child*0..]->(n) 

WITH n, 
    // An array of properties (including those which are null) 
    EXTRACT(node IN NODES(path) | node.levelId) AS levelIdsForTest 

WITH n, 
    // Filter the ones that are not null 
    FILTER(level IN levelIdsForTest WHERE level IS NOT NULL) AS levelIds 

RETURN n.id   AS id, 
     n.levelId  AS selfId, 
     // Take the last one - it is the nearest 
     LAST(levelIds) AS inheritId 
+0

,感謝您的解決方案 如何修改,如果我想要從多個父母繼承, 我發佈了類似的要求 http://stackoverflow.com/questions/42523140/inherit-properties-of-a-node-which-relationship-to-another-node-to-its柴爾德,在 –