微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Neo4j 不执行无向关系

如何解决Neo4j 不执行无向关系

我已经使用 neo4j 4.1 有一段时间了,虽然我觉得图结构应该非常适合我的问题,但我无法在任何合理的时间内执行它。

我将在下面详细介绍模型和问题,但我想知道是 (a) 图表不合适还是 (b) 我对问题建模不正确。

在我的域中,我有两个标签PersonSkill。每个都作为一个 id 属性,并且在该属性上有一个索引。

技能在父子关系中相互关联,暗示一个或多个子技能属于父技能,如下所示:

(s:Skill)-[r:IS_IN_CAT]->(s2:Skill)

一个人与一个技能的关系如下:

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

如下图所示:

enter image description here

我想问的问题是,给定一个拥有某项技能的人,通过该技能找到所有其他人的所有路径。

在上图中,如果 A 是人,我希望有 2 条路径:

(Person A) - [HAS_SKILL] - (Skill 1-1-1) - [IS_IN_CAT] - (Skill 1-1) - [IS_IN_CAT] - (Skill 1-1-2) - [HAS_SKILL] - (Person B)

(Person A) - [HAS_SKILL] - (Skill 1-1-1) - [IS_IN_CAT] - (Skill 1-1) - [IS_IN_CAT] - (Skill 1) - [IS_IN_CAT] - (Skill 1-2) - [HAS_SKILL] - (Person C)

我问这个查询的方式如下。

MATCH (p:Person {id: 100}) - [h:HAS_SKILL] -> (s:Skill) - [r:IS_IN_CAT*..] - (s2:Skill) <- [h2:HAS_SKILL] - (p2:Person)

对于任何中等大小的图表(10,000 项技能、1000 人、每人 5 项技能),这都不会返回。

我相当确定这是查询[r:IS_IN_CAT*..] 部分的无向性质,但我不知道如何重新建模以使其性能更好。

任何帮助将不胜感激。

解决方法

我最终通过将查询更改为仅依赖定向关系来解决此问题。这将非常大的数据集的性能降低到亚秒级。

查询最终看起来像:

MATCH (p:Person {id: 100}) - [h:HAS_SKILL] -> (s:Skill) - [r:IS_IN_CAT*..] -> (parentSkill:Skill) <- [r:IS_IN_CAT*..] - (s2:Skill) <- [h2:HAS_SKILL] - (p2:Person)

parentSkill 的引入允许关系保持方向性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。