我有下面的图形模型,并正在尝试编写一个 Cypher 查询,该查询查找从
Person
到 Skill
的最短路径,其中路径中至少包含一个关系 HAS_SKILL
的实例。
在模型中
Person
通过 Person
关系连接到另一个
IS_CONNECTED_TO
Person
通过 Skill
连接到
HAS_SKILL
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。
如果宇宙中心是 HAS_SKILL,我建议研究锚定该关系,然后从关系开始/结束节点进行路径查找。像这样的东西
匹配 (p:人)-[:HAS_SKILL]->(s:技能)
然后也许确定从特定人员到那些 p 的最短路径,然后仅采用 s 技能的那些 p 指向的最短路径,然后找到从那些 s 到特定技能的最短路径。
我不知道在不了解更多实际模型和挑战的情况下我们是否可以提出更多建议。
您可以使用类似 -
的查询match (人:人 {id: "48"}) (技能:技能 {id: '10667'}), 路径=最短路径((人)-[:HAS_SKILL *]-(技能)) 返回路径
这将仅遍历“HAS_SKILL”边缘。