Neo4j Neo4建模:使用关系属性导航图形-反模式备选方案

Neo4j Neo4建模:使用关系属性导航图形-反模式备选方案,neo4j,Neo4j,我正在开发一个应用程序,允许用户根据可用的在线课程推荐学习路径: 在我当前的模型中,序列是不同的节点。它们标志着用户创建的学习路径的开始,并包含关于序列的其他有用元数据(例如:知识领域、用户评分等) 然后,我们使用下一个关系浏览用户定义序列可能包含的所有课程 单个课程可能是许多不同用户创建序列的一部分,因此两个课程节点之间可能存在任意数量的下一个关系,并且每个关系都将父序列的id作为属性 这意味着在获取序列时,dbms需要遵循与特定路径id匹配的下一个关系,以便检索与该课程相关联的所有课程节点

我正在开发一个应用程序,允许用户根据可用的在线课程推荐学习路径:

在我当前的模型中,序列是不同的节点。它们标志着用户创建的学习路径的开始,并包含关于序列的其他有用元数据(例如:知识领域、用户评分等)

然后,我们使用下一个关系浏览用户定义序列可能包含的所有课程

单个课程可能是许多不同用户创建序列的一部分,因此两个课程节点之间可能存在任意数量的下一个关系,并且每个关系都将父序列的id作为属性

这意味着在获取序列时,dbms需要遵循与特定路径id匹配的下一个关系,以便检索与该课程相关联的所有课程节点

我从不同的来源了解到,使用关系属性来导航图形是一种反模式,因为它会导致对多个关系进行I/O访问

我只希望序列的最大长度约为20-30个课程。另一方面,我希望在应用程序中获取整个序列将是一个非常频繁的操作

我的问题是:这里的反模式是否合理,或者是否有更好的方法来实现这一点?

您可以添加引用
课程
节点的新节点(例如标记为
课程
),其中
课程
节点通过
下一个
关系链接在一起(不存储序列ID)。每个
序列
节点都会引用链中的第一个
课程ref
课程
节点本身将不再需要链接在一起

这可能是新的数据模型:

(:User)-[:SUBSCRIBED_TO]->(:Sequence)
(:Sequence)-[:STARTS_AT]->(:CourseRef)
(:Course)<-[:REFERS_TO]-(:CourseRef)-[:NEXT]->(:CourseRef)
(:Course)-[:REQUIRED_BY]->(:Course)

WHERE
子句对
r2
进行快速程度检查,以确保它是路径中的叶子
课程。

这实际上可能是一个非常好的解决方案。我的模型还需要一些数据,以便序列创建者可以添加他们自己对给定课程的输入(例如,评论、难度评分等)。这一举两得。谢谢
MATCH (u:User {id: 123})-[:SUBSCRIBED_TO]->(seq)-[:STARTS_AT]->(r1)
MATCH path = (r1)-[:NEXT*0..]->(r2)
WHERE SIZE((r2)-[:NEXT]->()) = 0
UNWIND NODES(path) AS ref
MATCH (ref)-[:REFERS_TO]-(course)
RETURN u, seq.id AS seqId, COLLECT(course) AS courses