我愿意将属性图存储到 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)我想我会广泛使用过滤器进行扫描。我猜正则表达式过滤器将成为我的朋友。您是否担心应用于此数据模型的过滤器的性能?