【发布时间】:2021-01-15 19:21:45
【问题描述】:
我已经使用 neo4j 4.1 有一段时间了,虽然我觉得图形结构应该很适合我的问题,但我无法让它在任何合理的时间内执行。
我将在下面详细说明模型和问题,但我想知道 (a) 图表是否不合适,或者 (b) 我对问题的建模不正确。
在我的域中,我有两个标签:Person 和 Skill。每个都作为id 属性,并且在该属性上有一个索引。
技能在父子关系中相互关联,意味着一个或多个子技能属于父技能,如下所示:
(s:Skill)-[r:IS_IN_CAT]->(s2:Skill)
人与技能的关系如下:
(p:Person)-[r:HAS_SKILL]->(s:Skill)
如下图所示:
我想问的问题是,给定一个有技能的人,通过该技能找到我通往所有其他人的所有路径。
在上图中,如果人 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*..] 部分的无向性质,但我不知道如何重新建模以使其性能更好。
任何帮助将不胜感激。
【问题讨论】:
标签: neo4j