在 "shared" 图中建模用户信息

Modeling user information in a "shared" graph

我有一个 Neo4j 图表,可以模拟课程中每个概念之间的静态关系。

现在我需要介绍一下每个学生在每个概念上的分数。

由于我需要进行复杂的查询并考虑到效率,我正在考虑为每个用户创建一个独立的静态图,以便可以将分数存储在每个节点中。问题是,如果一门课程有数百名学生,就会有数百张图表,每个用户课程一张。另一个问题是,如果我需要更改静态图,我需要将该更改应用于数百个图。

另一种方法是将学生分数作为属性存储在节点中。这样就只有一个图,每个节点都有数百个属性(分数),每个用户一个。

什么是好的方法?什么是更好的方法?

谢谢

假设您所说的分数是学生在特定概念上的表现,那么将该分数存储在学生节点或概念节点中似乎是不合适的。您应该将其存储在两者之间的关系中。假设您正在对学生进行微积分极限测验。我可能会这样做:

(s:Student {name: "Joe"})-[:learned { score: 100 }]->(c:Concept {name: "limits"})

您可能不会将分数放在 StudentConcept 中。

明智的数据建模,想想你领域中的 "nouns"(这里是学生和概念之类的东西)。然后思考它们之间的关系(学生学习概念)。不要过度填充节点,但也要使用关系上的属性来断言有关这些关系的元数据。学生学习概念的程度如何?这是 score 属性(或类似属性)关系,而不是概念。

另外,我不知道你的图有多大,但我可能不会存储一堆独立的图。这只是一个巨大的图,然后每个学生都可以有一个 "subgraph" 对应于一个特定的查询。将数据拆分到单独的存储中会给您带来维护和更新的噩梦。只有当你有确凿的证据证明你不能将性能作为一个大图表来工作时,我才会这样做(我打赌你可以让它工作)。想象一个拥有一百万学生和一百万个概念的数据库;您将始终能够即时生成每个学生的子图:

MATCH (s:Student {name:"Joe"})-[l:learned]->(c:Concept)
RETURN s, l, c;

如果您曾经使用过关系数据库,您可以将其视为 "view"。整个数据库仍然是数据库,但是使用这样的查询,您可以构建针对个人(在本例中为 Joe)量身定制的数据库的自定义视图。这为您带来了集中数据管理、建模、存储、更新的所有优势,而且每个用户都可以随心所欲地查看它,并且如果合适的话可以忽略 99% 的数据库。

如果你使用合适的标签和索引,这应该会表现得很好;像这样遍历关系是 neo4j 擅长的甜蜜点的死角。