【问题标题】:Conditionally creating vertex in Titan在 Titan 中有条件地创建顶点
【发布时间】:2014-09-03 05:48:36
【问题描述】:

我有一种情况,我需要检查一个顶点是否具有三个令人满意的属性 property1='a',property2='b',property3='c' 已经存在于图中,如果不存在,我需要创建它。基本上,图中应该有一个唯一的顶点,结合了这三个属性。我已经尝试了这个 gremlin 代码的 sn-p 来检查基于一个属性 'id'

getOrCreate = { id ->
  def p = g.V('userId', id)
  if (p.hasNext()) ? p.next() : g.addVertex([userId:id])

由于我是初学者,因此不太清楚修改它以实现我对 gremlin 的需要的最佳方法。我能想到的就是在最后一个语句中嵌套更多的 if 和 else。任何帮助表示赞赏,谢谢。

【问题讨论】:

    标签: graph-databases gremlin titan


    【解决方案1】:

    有几种方法。一种方法是稍微扩展您的遍历:

    getOrCreate = { one, two, three ->
      def p = g.V('prop1', one).has('prop2',two).has('prop3',three)
      p.hasNext() ? p.next() : g.addVertex([prop1:one,prop2:two,prop3:three])
    

    在上面的代码中,prop1 代表一个索引属性,那么你只需过滤其余的。 prop 应该是最具选择性的属性,因为它应该过滤掉最多的结果。

    如果由于某种原因prop 的选择性不够,那么这个解决方案可能不够快。换句话说,如果您有 10 亿个顶点并且g.V('prop1', one) 返回 100000,那么您将在内存中过滤这些顶点,这会有点慢。如果这是你的情况,我会考虑创建一个“穷人的”复合索引,方法是向 index on 添加第四个属性,将所有三个属性合二为一。然后就做你的查找。

    【讨论】:

    • 您能否确认这适用于多个并发客户端?例如。如果您同时通过 2 个 gremlin 客户端调用它,会发生什么?有一些场景浮现在脑海中,除非这是一个原子操作,否则将导致创建 2 个具有相同属性的顶点。 (可以使用唯一索引,但我认为这是避免条件创建请求)。
    • 从 Titan 的角度来看,假设您使用的是最终一致的后端之一,例如 Cassandra,您需要使用某种形式的 locking 来帮助防止重复。
    【解决方案2】:

    你快到了。

    getOrCreate = { p1, p2, p3 ->
      def p = g.V().has('property1', p1).has('property2', p2).has('property3', p3)
      p.hasNext() ? p.next() : g.addVertex(['property1':p1,'property2':p2,'property3':p3])
    }
    

    干杯, 丹尼尔

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多