【问题标题】:Neo4j not performing for undirected relationshipNeo4j 不执行无向关系
【发布时间】:2021-01-15 19:21:45
【问题描述】:

我已经使用 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


    【解决方案1】:

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

    查询最终看起来像:

    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 的引入使关系保持方向性。

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多