【问题标题】:How to find distinct nodes in a Neo4j/Cypher query如何在 Neo4j/Cypher 查询中找到不同的节点
【发布时间】:2013-05-08 03:23:13
【问题描述】:

我正在尝试在 neo4j/cypher 中进行一些模式匹配,但遇到了这个问题:

我要搜索两种类型的图表:

  1. 星形图:具有一个中心节点和多个传出关系的图。

  2. n 长度线图:长度为 n 的线图,其中没有节点重复(我的图中有一些双向边和循环)

所以主要问题是当我做一些事情时:

  1. 匹配 a-->b, a-->c, a-->d
  2. 匹配 a-->b-->c-->d

Cypher 不保证(当我尝试时)a、b、c 和 d 都是不同的节点。对于小图,这可以很容易地修复

WHERE not(a=b) AND not(a=c) AND ...

但我正在尝试制作大小为 10+ 的图形,因此检查所有节点之间的相等性不是一个可行的选择。 Afaik,RETURN DISTINCT 不能很好地工作,因为它不检查变量之间的相等性,只检查不同的行。有什么简单的方法可以指定查询以使不同命名的节点不同吗?

【问题讨论】:

  • 恐怕目前,除了使用 where close 之外别无选择!这是一个很好的功能,可以关闭密码,只提供没有冗余节点的路径,也许您应该考虑为功能请求打开一个问题
  • 他们正在努力在 2.0 中为其中一些查询添加密码语法。
  • 我知道这篇文章非常古老,但到目前为止有人找到解决方案吗?据我所知,新的查询语言版本目前还没有解决方案。此外,目前还没有列表(创建集合)的“独特”方法,我可以将其用作解决方法(如size(distinct([a,b,c,d])=4

标签: neo4j cypher distinct-values


【解决方案1】:

老问题,但请查看APOC Path Expander procedures 以了解如何解决这些类型的用例,因为您可以更改遍历唯一性行为以进行扩展(与使用遍历 API 时相同的方式......这些程序使用)。

Cypher 隐式使用 RELATIONSHIP_PATH 唯一性,这意味着每个返回的路径,关系必须是唯一的,它不能在单个路径中多次使用。

虽然这适用于需要所有可能路径的查询,但不适合需要不同节点或子图或防止路径中重复节点的查询。

对于一个长度为 n 的路径,假设深度为 6,只有任何类型的传出关系,我们可以将唯一性更改为 NODE_PATH,其中每个路径的节点必须是唯一的,路径中不能重复:

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.expandConfig(n, {maxLevel:6, uniqueness:'NODE_PATH'}) YIELD path
RETURN path

如果您希望所有可达节点达到一定深度(或通过省略 maxLevel 在任何深度),您可以使用 NODE_GLOBAL 唯一性,或者只使用apoc.path.subgraphNodes()

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.subgraphNodes(n, {maxLevel:6}) YIELD node
RETURN node

NODE_GLOBAL 唯一性意味着在所有路径中 一个节点必须是唯一的,它只会被访问一次,并且从给定的起始节点到节点只有一条路径。这可以显着减少需要评估的路径数量,但由于这种行为,如果关系扩展到已访问的节点,则不会遍历所有关系。

您不会通过此过程恢复关系(您可以为此使用apoc.path.spanningTree(),尽管如前所述,并非所有关系都将包括在内,因为我们只会捕获到每个节点的单个路径,而不是所有可能的路径节点)。如果您希望所有节点达到最大级别以及这些节点之间的所有可能关系,请使用apoc.path.subgraphAll()

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.subgraphAll(n, {maxLevel:6}) YIELD nodes, relationships
RETURN nodes, relationships

标签和关系过滤或基于预匹配节点列表的过滤(白名单、黑名单、endnode、终止节点)存在更丰富的选项。

我们还支持关系或节点标签的重复序列。

如果您需要在扩展过程中按节点或关系属性进行过滤,那么这不是一个好的选择,因为该功能尚受支持。

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多