如何使用DSE Graph

时间:2018-01-04 09:42:50

标签: datastax graph-databases datastax-enterprise datastax-enterprise-graph

我有一个简单的顶点“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

1 个答案:

答案 0 :(得分:3)

目前的建议是使用“bucketing”的概念来驱动C *世界中的数据模型设计,并通过创建表示链接组的中间Vertex将其应用于图形。

2个顶点标签

  1. URL
  2. URL_Group |分区键((url,group))...即具有2个分区键组件的composite primary key
  3. 2边

    1. 网址 - > URL_Group
    2. URL_Group(替换现有的自​​引用边缘)URL_Group< - > URL_Group 每组存储不超过100Kish url_fingerprints。在每个100kish边缘存在后创建一个新组。
    3. 此解决方案需要簿记以确定何时需要新组。 这可以通过一个简单的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

      此类遍历的可视化模型如下图

      Visual Representation