如何查找父节点

时间:2018-04-20 12:33:43

标签: neo4j cypher

我有一组表示层次结构的数据如下。

MATCH (dv:DATview {SUPid: 'VIE_ClassMeronomy_01' })<-[:TOV_CLASSIFIES]-(mv:METtypeOfView),     
(mv)<-[:TOO_CONSTRAINS_TOV]-(mo:METtypeOfObject)-[:TOO_CLASSIFIES(a:DATobject),     
(mv)<-[:TOL_CONSTRAINS_TOV]-(ml:METtypeOfLink)-[:TOL_CLASSIFIES]->(d:DATlink)  
return a,d

enter image description here

我尝试执行以下查询以获取父节点“Test Class A”,但它返回每个节点。假设是否没有传入LNK到节点,该节点是父节点。

MATCH (dv:DATview {SUPid: 'VIE_ClassMeronomy_01' })<-[:TOV_CLASSIFIES]-(mv:METtypeOfView),     
(mv)<-[:TOO_CONSTRAINS_TOV]-(mo:METtypeOfObject)-[:TOO_CLASSIFIES(a:DATobject),     
(mv)<-[:TOL_CONSTRAINS_TOV]-(ml:METtypeOfLink)-[:TOL_CLASSIFIES]->(d:DATlink)  
WHERE NOT (d)-[:LNK]->(a) 
return a,d

如何才能找到父节点?

2 个答案:

答案 0 :(得分:1)

在您的查询中,您将浏览ir.ui.viewDATobject类型的对象对的所有可能组合,当然对于每个节点DATlink是{{1}的节点1}},与之无关。

您需要找到一个根本没有链接的节点:

DATobject

答案 1 :(得分:0)

所以,假设你只想要直接父母,并且你拥有孩子的身份(让我们使用VIE_ClassMeronomy_01),那么你可以匹配

MATCH (parent)-->(child:DATview {SUPid: 'VIE_ClassMeronomy_01' }) return *

但由于您的数据具有中间节点,因此它将是

MATCH (parent)-->()-->(child:DATview {SUPid: 'VIE_ClassMeronomy_01' }) return *

如果你真的想要根节点,你可以要求没有传入链接的节点

MATCH (root) WHERE NOT ()-->(root) RETURN root

当然,根据需要在MATCH中使用标签/定义属性并且已知。

旁注http://console.neo4j.org/是分享示例数据的好方法,这样人们就可以更好地了解您的设置和约束。 (比图片更有用)

编辑:

你也可以做一个混合,从ID节点

获取root权限

MATCH (root)-[*]->(target{id:"heyo"}) WHERE NOT ()-->(root) RETURN root

或者,根据您的数据,这可能会更快

MATCH (root), (target{id:"heyo"}) WHERE NOT ()-->(root) MATCH (root)-[*]->(target) RETURN root