【问题标题】:How to fetch indirect relations through another node recursively in Neo4j?如何在 Neo4j 中递归地通过另一个节点获取间接关系?
【发布时间】:2020-09-30 12:19:53
【问题描述】:

我有一个需求,我需要递归地遍历一个图以通过中间连接节点映射出连接。

例如考虑电影图。如果两个人合作过一部电影,就可以认为他们是认识的。 通过这种间接关系,我想绘制出一个人不同层次的所有联系。

MATCH (p1:Person {name:'Tom Hanks'})-->(m:Movie)<--(p2:Person) RETURN p1, p2, apoc.create.vRelationship(p1, 'KNOWS', {movie:m.title}, p2)

这样我可以获得第一层连接,但我需要递归地执行此操作。

如果关系“知道”是真实的关系,我可以运行

MATCH (p1:Person {name:'Tom Hanks'})-[rel:KNOWS*]->(p2:Person) RETURN p1, p2, rel

但根据我阅读和尝试的内容,我无法为虚拟关系做到这一点。 我可以做些什么来实现这一目标吗?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    据我所知,这并不涉及“虚拟”关系,我认为您的意思是说可变/未指定的关系?

    可以从汤姆汉克斯返回任何长度的路径,你在正确的路径上,只需删除关系类型,如果你删除 ,搜索是无向路径,像这样的任何方向。我不认为这是你想要的,如果没有限制它会返回整个图表

    match p=(p1:Person {name:'Tom Hanks'})-[*]-()
    return p
    LIMIT 10
    

    注意:为了安全起见,我添加了 LIMIT 10,这是一种很好的做法,至少在您确定查询符合您的要求之前是这样。

    您能否举例说明您希望看到的查询结果?你想递归多远(你可以指定深度,例如 *..2),并通过每个关系类型?

    【讨论】:

    • 通过虚拟关系,我指的是 apoc 库中的 vRelationship。我无法在此处删除关系类型,因为我必须对此进行进一步过滤。我希望创建一张汤姆汉克斯认识的人的地图。查看它们的分离程度和连接路径等。此外,我想过滤电影的类型,可能是按类型。例如,我可能想按动作电影过滤这些连接。我仍然会得到汤姆汉克斯的联系地图,但这次,他们联系的电影将是动作片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多