使用Neo4j查找最远的节点(没有任何传入关系的节点)
我已经在Neo4j中创建了一个graph db,并希望将其用于泛化目的 它们之间大约有500000个节点(20个不同的标签)和250万个关系(50种不同的类型) 在示例路径中:a->b->c->d->e 我想找出没有任何传入关系(即“a”)的节点。 我应该对所有节点都这样做(在没有传入关系的所有可能路径的开始处查找节点) 我尝试了几种密码,但没有成功:使用Neo4j查找最远的节点(没有任何传入关系的节点),neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我已经在Neo4j中创建了一个graph db,并希望将其用于泛化目的 它们之间大约有500000个节点(20个不同的标签)和250万个关系(50种不同的类型) 在示例路径中:a->b->c->d->e 我想找出没有任何传入关系(即“a”)的节点。 我应该对所有节点都这样做(在没有传入关系的所有可能路径的开始处查找节点) 我尝试了几种密码,但没有成功: match (a:type_A)-[r:is_a]->(b:type_A) with a,count (r) as count wher
match (a:type_A)-[r:is_a]->(b:type_A)
with a,count (r) as count
where count = 0
set a.isFirst = 'true'
或
匹配(a:类型a),(b:类型a)
其中not(a)如果要查找没有传入关系的所有节点,可以使用可选匹配来查找它们:
START n=node(*)
OPTIONAL MATCH n<-[r]-()
WITH n,r
WHERE r IS NULL
RETURN n
START n=node(*)
可选匹配n您的第一个查询将只匹配存在关系的路径[r:is_a]
,因此计数r
永远不能为0。第二个查询将返回标记为:typeA
的任意一对节点,这些节点与[:is\u a]
没有传递关系。您需要的是对路径谓词进行筛选。对于一般情况,请尝试
MATCH (a)
WHERE NOT ()-->a
这大致可以翻译为“没有传入关系的任何节点”。例如,可以根据需要使用类型、属性或标签指定图案
MATCH (a:type_A)
WHERE NOT ()-[:is_a]->a
你说的“没有任何成功”是什么意思?发生了什么?只有10%的节点没有传入关系。但是我的查询会返回所有节点。@jjaderberg,tstorms感谢您的快速响应。这种节点类型有65247个成员,我知道其中大约10%没有传入关系。因此,正确的代码必须返回大约6500个节点。但是,我尝试过的所有代码,包括您发送给我的代码,都返回了65247个节点!我不知道如何在此查询中找到所有节点。我将您的代码更改为:match(a:type_a)可选匹配a返回计数(不同的a)
有线索吗?最好的情况是,我编辑了查询,其中的WHERE绑定到匹配项,因此它应用于匹配项中以过滤匹配结果。您必须添加一个带有afterward的查询。所有节点都会返回(有或没有传入关系)。有什么想法吗?如果运行第一个查询并返回a
,则返回的任何节点都没有传入关系。但您也可以使用诸如“某某类型的传入关系”或“来自标签为某某的节点”之类的内容来限定您的模式,很可能出现了一些问题。这里是控制台中的一个示例,从那里开始并尝试重现问题(您可以添加自己的数据的一个小样本)。
MATCH (a:type_A)
WHERE NOT ()-[:is_a]->a