neo4j查询排除与具有某些属性的节点相关的节点

时间:2017-01-29 06:01:20

标签: neo4j cypher graph-databases

我正在尝试编写一个neo4j查询,其中我只想呈现与具有特定属性的节点无关的节点。想到它的一种方法是存在两个单独的图,其中一个节点具有我想要排除的属性。我应该得到的结果只包含未连接到具有我想要排除的属性的节点的节点集的图形。这是我的查询之前的图形 enter image description here

match(n)where not(n {property:'valueIWishToExclude'}) - ()return n

这就是查询结果的样子 enter image description here

我只希望在结果中有四个连接的节点。如何设置一个查询,该查询排除未连接到具有我想要排除的属性的节点的节点?

3 个答案:

答案 0 :(得分:1)

你几乎就在那里,只需在查询中添加关系,只获取彼此相关的节点

MATCH (n:label) -[:RELATED]->()  where n.property<>'exclude'
RETURN n

这应该只返回彼此连接的节点,因为其他节点没有这种关系 如果这对您有用,请告诉我。

答案 1 :(得分:1)

你可能想稍微改变你的措辞,你在这个问题中要求的是什么,以及你真正想要的是什么,不是一回事。

在Neo4j(以及大多数图形数据库)中,短语&#34;节点与...&#34;无关。表示未通过与所讨论节点的关系连接的节点。

在该上下文中,在右图中(假设选择的一个节点是标记为排除的节点),一个节点将符合条件并作为可能的结果(最顶​​层节点)返回,因为它不是与要排除的节点有关系;但是,从排除的节点中删除了两个关系。

但是,你似乎在寻求别的东西。您似乎希望节点与要排除的节点不在同一子图中。或者,替代地,没有到被排除节点的路径的节点。

确保在将来的查询中您清楚了解您的要求,或者您将获得与您真正想要的内容无关的答案。

一种方法是首先找到被排除节点的子图中的所有节点,然后返回不在那些子图节点中的所有节点。

您希望安装APOC Procedures,以便您可以快速获取子图中的节点。

您还希望在图表中使用标签,并且可能会在您要搜索的属性上添加索引,因为这样可以加快搜索速度。就像现在一样,您的查询必须检查整个数据库中的每个节点,以查找具有相关属性的节点,并且随着图形的增长,这将变得越来越慢。

您的查询可能如下所示(使用&#39;标签&#39;作为节点标签的替代品):

MATCH (n:Label{propertyToExclude:'valueToExclude'})
CALL apoc.path.expandConfig(n, {bfs:true, uniqueness:"NODE_GLOBAL"}) YIELD path
WITH COLLECT(DISTINCT LAST(NODES(path))) as subgraph
MATCH (n)
WHERE NOT n in subgraph
RETURN n

答案 2 :(得分:1)

实际上,您需要那些没有应该排除的节点路径的节点。您可以使用shortestPath函数和ALL谓词:

match (ex) where n.property = 'valueIWishToExclude'
with collect(ex) as exn
match (n) where (not n.property = 'valueIWishToExclude') and
                ALL(e in exn where not shortestPath( (n)-[*]-(e) ) is null)
return n