在“共享”图中建模用户信息

时间:2015-01-28 12:37:46

标签: graph neo4j graph-databases

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

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

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

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

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

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

明智的数据建模,想想你域中的“名词”(这里是学生和概念)。然后想想他们之间的关系(学生学习概念)。不要过度填充节点,但也要在关系上使用属性来断言关于这些关系的元数据。学生学习概念的能力如何?这是关系的score属性(或类似),而不是概念。

另外,我不知道你的图表有多大,但我可能不会存储一堆独立的图表。这只是一个巨大的图形,然后每个学生都可以拥有一个对应于特定查询的“子图”。将数据拆分到单独的存储中会为您创建维护和刷新恶梦。我只会这样做,如果你有确凿的证据证明你不能把性能作为一个大图(我打赌你可以使它工作)。想象一下拥有一百万学生和一百万个概念的数据库;你总能在飞行中生成每个学生的子图:

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

如果您曾经使用过关系数据库,则可以将其视为“视图”。整个数据库仍然是数据库,但是使用这样的查询,您可以构建针对个人定制的数据库的自定义视图(在本例中为Joe)。这将为您带来集中数据管理,建模,存储,更新等所有优势,但每个用户都可以看到它们,但如果合适,可以忽略99%的数据库。

如果你使用适当的标签和索引,这应该表现得很好;穿越这样的关系是neo4j擅长的最佳点的死角。