neo4j Cypher:如何检查集合中至少有一个节点与给定的属性匹配?

new9mtju  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(159)

我在neo4j中有一个数据模型,其中一个Person节点可以与另一个节点“合并”--不是字面上的合并,只是一个关系,形式如下:
(a:Person)-[:MERGED]-(other:Person)
当然,b可以与其他人合并,这是一条潜在的无止境的道路。
我有一个查询返回一个人员列表,其中“合并的”人员(即:MERGED路径中的任何人)作为属性嵌入。

MATCH (a:Person)
CALL {
    WITH a
    MATCH path = (a)-[:MERGED*]-(other)
    RETURN COLLECT(other{.label}) as b
}
 RETURN a{.label, merged_items:b}

例如,这将返回如下内容:

{
  "label": "John Smith",
  "merged_items": [
    {
      "label": "Toby Jones"
    },
    {
      "label": "Seamus McGibbon"
    },
    {
      "label": "Aaron Drew"
    }
  ] 
}

对于这个合并链中的每个Person(所以实际上完整的结果有四个项,每个连接的人都是a-这正是我想要的)。
现在,我希望能够通过Person.label * 过滤 * 结果,但是链中的任何一个Person都可以匹配(a或任何other)。
你知道我该怎么做吗?
我已经尝试了很多不同的东西(例如any()),但无法让它工作。

rkttyhzu

rkttyhzu1#

any()的语法为WHERE any(e IN list WHERE predicate(e))
所以对你来说,这应该行得通。

WITH  COLLECT(other{.label}) as b
WHERE any(e IN b WHERE e.label = a.label)
RETURN b

原则上你可以在收集之前就把它应用到路径上,tail(list)是这样的,它排除了aa是路径的第一个节点。

MATCH ...
WHERE any(n in tail(nodes(path)) WHERE n.label = a.label)

相关问题