neo4j:包含特定关系的最短路径

问题描述 投票:0回答:2

我有下面的图形模型,并正在尝试编写一个 Cypher 查询,该查询查找从

Person
Skill
的最短路径,其中路径中至少包含一个关系
HAS_SKILL
的实例。

在模型中

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

我提出了以下查询,该查询有效,但会解开路径中的所有关系,以检查

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。

neo4j cypher
2个回答
0
投票

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

匹配 (p:人)-[:HAS_SKILL]->(s:技能)

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

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


0
投票

您可以使用类似 -

的查询

match (人:人 {id: "48"}) (技能:技能 {id: '10667'}), 路径=最短路径((人)-[:HAS_SKILL *]-(技能)) 返回路径

这将仅遍历“HAS_SKILL”边缘。

© www.soinside.com 2019 - 2024. All rights reserved.