【问题标题】:finding the farthest node using Neo4j (node without any incoming relation)使用 Neo4j 找到最远的节点(没有任何传入关系的节点)
【发布时间】:2014-03-27 13:57:47
【问题描述】:

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

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

在示例路径中:a -> b -> c-> d -> e

我想找出没有任何传入关系的节点(即“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 中创建这段代码。

【问题讨论】:

  • “没有任何成功”是什么意思?发生了什么?
  • 只有 10% 的节点没有传入关系。但我的查询返回所有节点。

标签: neo4j cypher neo4jclient


【解决方案1】:

您的第一个查询将仅匹配存在[r:is_a] 关系的路径,因此计数r 永远不会为0。您的第二个查询将返回任何标记为:typeA 的任意节点对,这些节点不通过以下方式传递相关[:is_a]。您想要的是过滤路径谓词。对于一般情况,请尝试

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

这大致翻译为“任何没有传入关系的节点”。您可以根据需要指定带有类型、属性或标签的模式,例如

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

【讨论】:

  • 返回所有节点(有或没有传入关系)。有什么想法吗?
  • 如果您运行第一个查询并返回a,则返回的任何节点都没有传入关系。但是您也可以使用诸如“某某类型的传入关系”或“来自带有某某标签的节点”之类的内容来限定您的模式,那里可能会出现问题。这是控制台中的basic example,从那里开始并尝试重现问题(您可以添加自己数据的小样本)。
【解决方案2】:

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

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

【讨论】:

  • @jjaderberg ,tstorms 感谢您的快速回复。这种节点类型有 65,247 个成员,我知道其中大约 10% 没有传入关系。因此,正确的代码必须返回大约 6500 个节点。但是,我尝试过的所有代码,包括您发送给我的代码,都返回了 65,247 个节点!我不知道如何在此查询中找到所有节点。我将您的代码更改为:match (a:type_A) OPTIONAL MATCH a &lt;-[r:is_a]-(b:type_A) WHERE r IS NULL RETURN count(distinct a)match (a:type_A) Where not ()-[:is_a]-&gt;a RETURN count( distinct a) 任何线索?最好的,
  • 我编辑了查询,WHERE 与匹配项相关联,因此将其应用于匹配项inside 以过滤匹配结果,您必须在之后添加一个 with
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多