使用Neo4j找到最远的节点(没有任何传入关系的节点)

时间:2014-03-27 13:57:48

标签: neo4j cypher neo4jclient

我在Neo4j中创建了一个图形数据库,并希望将其用于泛化目的。

它们之间有大约500,000个节点(20个不同的标签)和250万个关系(50种不同类型)。

在示例路径中:a - > b - > C-> d - > ë

我想找出没有任何传入关系的节点(即'a')。 我应该为所有节点执行此操作(在所有可能路径的开头找到没有传入关系的节点)。

我尝试了几个Cypher代码但没有取得任何成功:

match (a:type_A)-[r:is_a]->(b:type_A) 
with a,count (r) as count
where count = 0 
set a.isFirst = 'true'

match (a:type_A), (b:type_A) 
where not (a)<-[:is_a*..]-(b) 
set a.isFirst = 'true'

问题在哪里?!

另外,我也必须在neo4jClient中创建此代码。

2 个答案:

答案 0 :(得分:3)

您的第一个查询仅匹配存在关系[r:is_a]的路径,因此计算r永远不会为0.您的第二个查询将返回标记为:typeA的任意一对节点[:is_a]没有传递相关的内容。你想要的是过滤路径谓词。对于一般情况,请尝试

MATCH (a)
WHERE NOT ()-->a

这大致翻译了#34;任何没有传入关系的节点&#34;。您可以根据需要使用类型,属性或标签指定模式,例如

MATCH (a:type_A)
WHERE NOT ()-[:is_a]->a

答案 1 :(得分:0)

如果要查找没有传入关系的所有节点,可以使用OPTIONAL MATCH找到它们:

START n=node(*)
OPTIONAL MATCH n<-[r]-()
WITH n,r
WHERE r IS NULL 
RETURN n