2017-02-23 64 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柴尔德,在 –