2017-02-23 5 views
0

:すべての私のノードがObject型である継承プロパティ - 私は私のグラフが構築されていな問題には、このような何かを実行しているのNeo4j

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

を:すなわち、マッチ( N:Object)を そして私は、ノードGまでなどだけで1つのリレーション(親と子) すなわち、(A)-[:child]->(B)(A)-[:child]->(C)(B)-[r:child]->D、と

をこのグラフを作成している私はと呼ばれる各ノードで定義されたプロパティがあります:levelID 一部をノードのこのlevelIDを持たないかもしれません。 levelIDを持たないノードは、親ノードから継承する必要があります。今

、Iは、CYPHER(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 

これは、所望の出力を与えていないが。期待

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

(CとG levelId =ヌルを持っていると考える)。しかし、これは私の実際:(

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 -child-in –

関連する問題