gpt4 book ai didi

java - Neo4j:关于使用共享节点对图进行建模但具有基于某些属性的唯一路径的方法的建议

转载 作者:行者123 更新时间:2023-11-30 06:55:12 24 4
gpt4 key购买 nike

我正在尝试为我正在开发的应用程序制定数据模型。该应用程序当前使用 Neo4j。

基本模型有3种类型:类(class)、测试、问题。该应用程序允许用户创建类(class),然后将测试(现有的或新的)与类(class)相关联。然后,他们可以在测试中添加或删除问题,但这种添加和删除不应影响图表中的其他类(class)/测试。

以下是我想到的不同模型的优缺点:

1.) 创建类(class)节点、测试节点的边,然后在测试问题上使用带有类(class) id 的边属性创建/删除问题的边。使用此模型,密码查询将如下所示:

match (c:COURSE {id:'123'})<--(t:TEST)-[r]->(q:QUESTION) where r.courseId='123' return c, t, q;

优点:简单的数据模型。最明显的解决方案。

缺点:在 2 个节点之间有数百条边之后,性能确实会受到影响,因为从类(class)到问题没有 1 个简单的路径,它需要评估/比较所有边。

2.) 创建类(class)节点,一条到测试节点的边,然后对于测试和问题之间的边,使用类(class) id 作为边的类型。使用此模型,密码查询将如下所示:

match (c:COURSE {id:'123'})<--(t:TEST)-[:123]->(q:QUESTION) return c, t, q;

优点:根据我的研究,Neo4j 似乎可以更好地处理这种类型的建模。

缺点:边类型的数量有上限吗?不确定如果有数百或数千个类(class),性能是否会比第一名更好。

3.) 创建类(class)节点、测试节点的边,并使用类(class) ID 列表仅创建 1 个边。使用此模型,密码查询将如下所示:

match (c:COURSE {id:'123'})<--(t:TEST)-[r]->(q:QUESTION) where r.courseIds contains '123' return c, t, q; (不是正确的语法,但你明白了)

优点:看起来仍然很简单

缺点:不确定 cypher 是否支持该类型的查询。扫描单个边的属性列表是否与扫描具有单个属性的所有边一样糟糕?

4.) 为每门类(class)创建测试和问题的副本。

优点:似乎是迄今为止最快的解决方案,因为只有 1 条路径并且不需要比较。只需从类(class)开始并遍历整个图表即可。

缺点:这会导致大量冗余数据。看起来这会违背使用图表的目的,并且可以在 Cassandra 或其他一些数据存储中更好地建模。

5.) ??? - 寻找我错过的任何其他建议

基本上,我正在寻找的是创建具有共享节点的图形的最佳方法,但具有基于某些属性的唯一路径,其中性能不是完成遍历的分钟数量级大量可能的属性值。

注释:

  • 我只实现了#1,这就是我在创建数百个类(class)后发现查询性能非常糟糕的原因。
  • 我在提出问题时尝试尽可能清晰完整,但如果我遗漏了什么,请要求澄清。
  • 我进行了很多查找,但没有找到对此进行建模的好方法。

最佳答案

我认为没有必要将类(class) ID 存储在多个位置,然后再查询匹配的 ID。

这是一个对我来说更有意义的更简单的模型。每个 Test 节点都与单个 Course 节点相关,并且与多个 Question 节点相关。

要查找单个类(class)的每个测试(及其问题集合),查询如下所示:

MATCH (c:Course {id:'123'})<-[:FOR]-(t:Test)-[:HAS_QUESTION]->(q:Question)
RETURN c, t, COLLECT(q) AS questions;

关于java - Neo4j:关于使用共享节点对图进行建模但具有基于某些属性的唯一路径的方法的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com