我有一个简单的顶点“url”:
schema.vertexLabel('url').partitionKey('url_fingerprint', 'prop1').properties("url_complete").ifNotExists().create()
edgeLabel称为“链接”,它将一个网址连接到另一个网址。
schema.edgeLabel('links').properties("prop1", 'prop2').connection('url', 'url').ifNotExists().create()
一个网址可能有数百万个传入链接(例如ebay.com的所有子页面的首页)。
但由于宽分区(来自Opscenter宽分区报告),这似乎导致了非常大的分区/ dse崩溃: graphdbname.url_e(2284 mb)
我该如何避免这种情况?如何处理这个“超级节点”?我已经为标签找到了一个“分区”命令(关于这个[1]的文章)但是已经弃用并将在DSE 6.0中删除/发行说明中的唯一提示是以另一种方式建模数据 - 但是我我不知道在那种情况下我怎么做。
我对每一个提示感到高兴。谢谢!
[1] https://www.experoinc.com/post/dse-graph-partitioning-part-2-taming-your-supernodes
答案 0 :(得分:3)
目前的建议是使用“bucketing”的概念来驱动C *世界中的数据模型设计,并通过创建表示链接组的中间Vertex将其应用于图形。
2个顶点标签
2边
此解决方案需要簿记以确定何时需要新组。 这可以通过一个简单的C *表来完成,以便快速,轻松地检索。
CREATE TABLE lookup url_fingerprint, group, count counter PRIMARY KEY (url_fingerprint, group)
这应保留DESC顺序,如果未保留DESC顺序,可能需要添加ORDER BY语句。
在写入图表之前,需要阅读表格以找到最新的组。
SELECT url_fingerprint, group, count from lookup LIMIT(1)
如果计数器是> 100kish,创建一个新组(增量组+1)。在向Graph写入新行期间或之后,需要递增计数器。
遍历需要类似于:
g.V().has(some url).out(URL).out(URL_Group).in(URL)
在概念上,您可以遍历URL之类的关系 - > URL_Group-> URL_Group< -URL
此类遍历的可视化模型如下图