在图表DB中建模值 - 顶点或属性?

时间:2014-12-07 21:32:42

标签: graph graph-databases titan gremlin

我在图形数据库(Cassandra顶部的Titan 0.5.2)中建模数据集,它具有实体(由顶点表示)和两种类型的属性 - 实体之间的链接(自然由边缘表示)和标量属性(如字符串或数字)。有许多属性类型(现在大约2000),每个属性类型总是相同类型(即属性P1总是链接,属性P2总是字符串)但每个实体可以有任何属性和属性集可以是重复(即,实体E1可以具有三个P2值而没有P1值)。

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

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

1 个答案:

答案 0 :(得分: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-SNAPSHOT/data-model.html

你需要注意的一件事是顶点行失去控制。你提到顶点可能有100个属性,听起来不错。如果你开始进入100K,那么你可能会遇到使用顶点的问题,特别是在执行OLAP操作时。

需要注意的另一件事是Edge属性与Vertex没有相同的功能。