6

我愿意将属性图存储到 HBase 中。属性图是图的节点和边具有属性,只要边属于不同的类型,多条边可以链接相同的节点元组。

我的查询模式将要么询问属性和邻域,要么遍历图表。一个例子是:Vertex[name=claudio]=>OutgoingEdge[knows]=>Vertex[gender=female],这将给我所有claudio喜欢的女性。

我知道图形数据库就是这样做的,但是如果数据集很大,它们通常不会在多个节点上扩展。所以我愿意在 NoSQL ColumnStore(HBase,Cassandra ...)上实现这个

我的数据模型如下。

顶点表:
key: vertexid (uuid)
Family "Properties:": <property name>=><property value>, ...
Family "OutgoingEdges:": <edge key>=><other vertexid>, ...
Family "IncomingEdges:": 与传出边缘相同...

该表允许我快速获取顶点的属性及其邻接列表。我不能将 vertexid 用作另一个端点,因为多条边(具有不同类型)可以连接相同的两个顶点。

Edges Table :
key: edge key (composite(<source vertexid>, <destination vertexid>, <edge typename>)) (即vertexid1_vertexid2_knows)
Family "Properties:": <property name>=><property value>, ...

该表允许我快速获取边缘的属性。

边类型
key:composite(<source vertexid>, "out|in", <edge typename>) (即vertexid1_out_knows)
Family "Neighbor:": <destination vertexid>=>null,...

该表允许我搜索/扫描从顶点传入或传出并且属于特定类型并且将是 API 遍历能力的核心的边缘(所以我希望它在两个方面都尽可能快网络 I/O (RPC)、磁盘 I/O (seek))。它还应该在图的大小上“缩放”,这意味着随着图的增长,这种类型的操作的成本应该取决于从顶点传出的边数,而不是顶点和边的总数。上面的示例我将考虑 vertexid1 具有属性名称的源顶点:claudio 我将扫描 vertexid1_out_knows 并接收连接的顶点列表。之后,我可以扫描这些顶点上的“属性:性别”列并查找具有“女性”值的那些。

问题:

1) 一般:您认为我的运营有更好的数据模型吗?
2)我可以把所有东西都放在一张桌子上,对于某些键,一些家庭会是空的(即“OutgoingEdges:”家庭对边缘没有意义)?我喜欢这样,因为你可以看到所有的键都是由 vertexid uuid 前缀组成的,所以它们会非常紧凑并且主要适合同一个区域服务器。
3)我想我会广泛使用过滤器进行扫描。我猜正则表达式过滤器将成为我的朋友。您是否担心应用于此数据模型的过滤器的性能?

4

1 回答 1

2

这种类型的模型看起来像是 Cassandra 的一个明智的起点(对 HBase 了解不多) - 但对于任何分布式存储,您在遍历时都会遇到问题,因为遍历将跨越多个节点。

这就是为什么Neo4J等专用图数据库使用单节点设计,并尝试将所有数据保存在 RAM 中的原因。

查找特定节点或边缘的属性应该可以很好地工作并且可以水平扩展——Twitter 的FlockDB(现在显然被放弃了)就是一个显着的例子。

您还需要考虑是否需要除 ID 之外的查找(即您是否需要任何索引)?

于 2012-01-09T09:33:34.063 回答