我在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()
),但无法让它工作。
1条答案
按热度按时间rkttyhzu1#
any()
的语法为WHERE any(e IN list WHERE predicate(e))
所以对你来说,这应该行得通。
原则上你可以在收集之前就把它应用到路径上,
tail(list)
是这样的,它排除了a
,a
是路径的第一个节点。