我在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中创建此代码。
答案 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