在图数据库中建模值 - 顶点还是属性?

问题描述 投票:0回答:1

我正在图形数据库(Cassandra 之上的 Titan 0.5.2)中对数据集进行建模,该数据库具有实体(由顶点表示)和两种类型的属性 - 实体之间的链接(自然由边表示)和标量属性(例如字符串或数字)。有多种属性类型(现在大约有 2000 个),每个属性类型始终是同一类型(即,属性 P1 始终是链接,属性 P2 始终是字符串),但每个实体可以具有任何属性集,并且属性可以是重复(即,实体 E1 可以有三个 P2 值,但没有 P1 值)。

问题是如何对 P2 的标量值进行最佳建模 - 它们应该是实体顶点 E1 的一部分吗?实体顶点 E1 和属性顶点 P2 之间的边上的属性? E1 和包含实际值的值顶点之间的边,标记为 P2?还有别的事吗?我主要感兴趣的是每个解决方案的性能考虑因素 - 即,在顶点或“薄”顶点上有很多属性更好,但有很多属性和很多边?索引它们有什么区别吗? 但我也对其他考虑因素感兴趣,例如查询的便利性等。

数据集包含数千万个实体(但可能会增长,可能达到数亿个),每个顶点通常具有大约 10-20 个属性,但某些顶点可以具有更多属性,即数百个或更多。预期的查询可以使用任何属性,包括它存在的事实及其值,并且还可能需要诸如“该实体的最大 P2 值”或“该实体是否具有满足特定条件的任何 P2 值”之类的计算。查询计划通过 Gremlin 类型的查询来完成,但如果有帮助的话,也不排除使用 Titan-only 功能。

graph graph-databases titan gremlin
1个回答
1
投票

就个人而言,我认为将顶点属性建模为顶点的属性通常是最自然的。当使用 Titan 的新多属性和元属性功能时更是如此。多属性是 LIST/SET 属性,元属性是属性上的属性。以下是完整描述这一点的相关文档:

http://s3.thinkaurelius.com/docs/titan/0.9.0-SNAPSHOT/advanced-schema.html#_multi_properties

http://www.tinkerpop.com/docs/3.0.0-SNAPSHOT/#vertex-properties

您可以在属性上创建以顶点为中心的索引,以启用诸如“该实体的最大 P2 值”之类的查询。就性能而言,这个解决方案应该运行得很好。

http://s3.thinkaurelius.com/docs/titan/0.5.0-SNAPSHOT/indexes.html#vertex-indexes

默认情况下,Titan 只会检索您要求的属性(除非您通过 query.fast-property 明确告诉它不要检索),并且它可以在顶点的行内完成所有这些操作,因此速度很快。其中描述如下

http://s3.thinkaurelius.com/docs/titan/0.9.0-SNAPSHOT/data-model.html

您需要注意的一件事是顶点行的增长失去控制。您提到一个顶点可能有数百个属性,这听起来不错。如果您开始达到 100K,那么您可能会遇到使用顶点的问题,尤其是在执行 OLAP 操作时。

另一件事要注意的是,边属性不具有与顶点相同的功能。

© www.soinside.com 2019 - 2024. All rights reserved.