【问题标题】:Find node with relation to all nodes in collection查找与集合中所有节点相关的节点
【发布时间】:2013-09-27 11:53:29
【问题描述】:

我有一个包含节点、关系、节点、关系、...集合的路径。 我想找到与此路径中所有节点相关的节点。

有人可以在 Cypher 中给出示例查询吗?

现在我有

START startNode=node(3), endNode=node(5)
MATCH path=startNode-[:CONNECT*]->endNode
WITH path, relationships(path) AS connections, nodes(path) AS nodes

问题是我不知道如何使用节点集合来查找与该集合中的所有节点有关系的节点。关系类型为 :CONTAINS,它在节点集合中从搜索的节点到节点。集合中的所有节点都必须与搜索到的节点有关系。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这是一个查询,它应该将具有关系 [:CONTAINS] 的节点集合返回到具有指定起点和终点的路径上的节点“midNode”。它按路径对所需的“searchedNode”进行分组。

    START startNode=node(3), endNode=node(5)
    Match path=startNode-[:Connect*]->midNode-[:Connect*]->endNode, searchedNode-[:CONTAINS]->midNode
    Return distinct path, collect(searchedNode) as searchedNodes
    

    更新:需要注意的是,标识符“midNode”表示两个指定起点和终点之间的路径上的每个节点,因为可变长度关系 [:Connect*] 将其连接到起点和终点.具体来说,它表示离起始节点一步之遥的节点('m1'),如本例中的 startNode-[:Connect]->m1-[:Connect]->...->endNode;和 'm2' 距离起始节点两步,如本例中的 startNode-[:Connect]-()-[:Connect]->m2-[:Connect]->...->endNode。事实上,匹配的路径将是一组路径,每个路径对应于 startNode 和 endNode 之间的一个节点。由于我们只希望路径上的所有中间节点都有一条路径,因此使用 DISTINCT 删除重复路径,并且 searchedNode 将按路径键分组,因此 searchedNode 的集合将是集合与 startNode 和 endNode 之间的路径上的所有节点相关的所有节点。

    【讨论】:

    • 感谢您的回复,但这意味着如果一个节点与 midNode [:CONTAINS] 有关系,那么它将被返回。下一个 midNode 不需要和这个 searchedNode 有这种关系。我想找到与路径上所有这些节点有关系的节点,而不是仅仅一个 midNode。
    • 不,标识符“midNode”代表路径上的每个节点,而不仅仅是单个节点。我已经更新了答案以使其更清楚。试一试,看看它是否能得到你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多