neo4j - Neo4j 不执行无向关系
问题描述
我已经使用 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*..]
查询部分的无向性质,但我不知道如何重新建模以使其性能更好。
任何帮助,将不胜感激。
解决方案
我最终通过将查询更改为仅依赖定向关系解决了这个问题。这将非常大的数据集的性能降低到亚秒级。
查询最终看起来像:
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
允许关系保持方向性。
推荐阅读
- python - 函数'对象没有属性'对象
- javascript - 反应没有表单组件的输入表单?
- javascript - 如何从 Google 表格运行 Google Doc ID 循环
- power-automate - 无法创建流
- pyspark - Pyspark 结构化流应用程序打印控制台中每个文件的执行时间
- python-3.x - 如何知道线性回归模型是否运行良好?
- excel - VBA 锁定单元格不会改变颜色
- swift - 为什么在定义 SCNNode.look 时 SCNNode 变得不可见?
- elasticsearch - Elasticsearch - 如何仅在搜索“英语”单词时才获得“英语”结果?
- javascript - Vue 客户端和 Marko 服务器端 (MPA)