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)<-[r:REL*0..]-(m) where n.id = xxx return m;
以及 m 的所有孩子。以上是关于Neo4j 密码查询以获取与特定其他节点没有关系的所有节点的主要内容,如果未能解决你的问题,请参考以下文章