首页 > 解决方案 > Neo4j 不执行无向关系

问题描述

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

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

在我的域中,我有两个标签:PersonSkill. 每个都作为一个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

解决方案


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

查询最终看起来像:

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允许关系保持方向性。


推荐阅读