Neo4j 密码查询以获取与特定其他节点没有关系的所有节点

Posted

技术标签:

【中文标题】Neo4j 密码查询以获取与特定其他节点没有关系的所有节点【英文标题】:Neo4j cypher query to get all nodes without a relationship to specific other node 【发布时间】:2016-02-18 13:57:53 【问题描述】:

我使用 Neo4j 2.3.1 并且正在寻找一个密码查询,它为我提供数据库中未连接到特定其他节点的所有节点。 我的树看起来像这样:

我知道红色的,想问一下绿色的。它们都具有相同的关系。

编辑:我的问题措辞具有误导性,因此:我想要的(如图所示)所有“高于”特定节点的节点及其子节点。

【问题讨论】:

一般来说,一个图数据库可以有多个不相交的子图(甚至不必是树)。例如,假设这里有其他节点没有以任何方式连接到您的树。您是否还想要不相交子图中的节点及其关系? 你的红色节点上方的绿色节点连接到红色节点......所以你的陈述本身是不一致的:) @MichaelHunger - 是的,你是对的,我的描述和图片显示的内容不同 - 我会改变 【参考方案1】:

这应该可行:

MATCH (red)<-[*]-(parent)-[*0..10]->(children)
WHERE red.id = xxx
RETURN parent, children

找到红色节点的所有父节点和父节点的所有子节点。

【讨论】:

由于 cypher 不会两次遍历关系,这应该是最有效的。 谢谢,这对我帮助很大,而且速度非常快。【参考方案2】:

一般来说,一个图数据库可以有多个不相交的子图(甚至不必是树)。例如,假设有其他节点未以任何方式连接到您的子图。

这是一种方法,您可以通过转发REL 关系获取未连接到指定节点的 所有 节点。我假设所有有趣的节点都具有相同的标签 (Foo),并且还有其他节点没有该标签。

MATCH (n:Foo  id: 123 )-[:REL*]->(m:Foo)
WITH (COLLECT(DISTINCT m) + n) AS not_wanted
MATCH (x:Foo)
WHERE NOT x IN not_wanted
RETURN x;

注意:此查询可能需要很长时间(或内存不足),具体取决于以n 为根的“树”的大小以及数据库中有多少节点。您应该省略无助于过滤掉任何内容的节点标签。

【讨论】:

感谢您的回答。返回没有任何关系的节点的好主意。查询运行良好并返回正确的结果,但是,正如您所说,查询非常慢,对于 17000 个节点,它需要几分钟..【参考方案3】:

视情况而定。假设您的所有节点标签都相同,这应该可以工作:

   MATCH (a:circle)-[r]->(b:circle)
    WHERE a.colour <> 'Red' AND b.colour <> 'Red'
    RETURN a,b

【讨论】:

颜色只是为了可视化 - 我不知道颜色 ;-) 我只知道“红色”节点的 ID,并且想要所有不是该节点子节点的节点。 每个节点的不同之处是什么?是每个节点上的标签或属性使其具有不同的颜色吗?答案取决于实际的数据。 忘记颜色 - 所有节点都具有相同的标签并以相同的关系类型连接。正如我所说,我只有一个节点的 ID,并且希望树中的所有节点都位于该节点的“上方”。我搜索类似这样的内容:match (n)&lt;-[r:REL*0..]-(m) where n.id = xxx return m; 以及 m 的所有孩子。

以上是关于Neo4j 密码查询以获取与特定其他节点没有关系的所有节点的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j - 复杂的密码查询 - 需要外连接

使用密码删除neo4j中的所有节点和关系超出堆空间

使用 Cypher 在 Neo4j 中通过模式移动与其他节点的关系

Neo4j中如何计算关系的数量

奇怪的 neo4j 密码行为

当与其他节点匹配时,Neo4J返回节点两次