【问题标题】:neo4j: Shortest path that includes specific relationshipneo4j:包含特定关系的最短路径
【发布时间】:2020-10-15 07:40:55
【问题描述】:

我有下面的图形模型,并且正在尝试编写一个 Cypher 查询,以找到从 PersonSkill 的最短路径,该路径中至少包含一个关系 HAS_SKILL 的实例。

在模型中

  • Person 通过IS_CONNECTED_TO 关系连接到另一个Person
  • Person 通过HAS_SKILL 连接到Skill
  • 一个Skill 通过IS_RELATED_TO 关系连接到另一个Skill

我提出了以下查询,该查询有效,但会打开路径中的所有关系以检查 HAS_SKILL 关系是否是其中一种关系。

match (person:Person {id: "48"}), (skill:Skill {id: '10667'}),
path = shortestPath((p)-[*..30]-(s))
WHERE ANY(r in relationships(path) where type(r) = 'HAS_SKILL')
return path;

有没有更有效的方法来做到这一点?

我在(p)-[*..30]-(s) 中使用过关系模式匹配,但我无法让它以与 where 子句中的ANY 相同的方式工作?

这是使用 neo4j 4.1.0。

【问题讨论】:

  • Person 和 Skill 之间的路径是否可能不包含 HAS_SKILL 类型的关系?从您的图表模式来看,似乎不是?
  • 这里是正确的,但它只是完整模型的一个子集。完整模型确实允许到 Skills 的替代路径,而不是通过 HAS_SKILL

标签: neo4j cypher


【解决方案1】:

如果宇宙的中心是 HAS_SKILL,我建议研究锚定该关系,然后从关系开始/结束节点中查找路径。像这样的

匹配 (p:Person)-[:HAS_SKILL]->(s:Skill)

然后也许确定从特定人到那些p的最短路径,然后只取s技能的那些p指向的最短路径,然后找到从那些s到特定技能的最短路径。

在不了解实际模型和挑战的情况下,我不知道我们是否可以提出更多建议。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多