【问题标题】:Merge vertexes and edge between them at the same time in Gremlin在 Gremlin 中同时合并顶点和边
【发布时间】:2021-02-28 10:22:02
【问题描述】:

我有一个数据源,我读取并尝试将其加载到我的 CosmosDB 图表中。我获取的每一行都包含有关多个实体(人、软件)的信息。我在这里要做的是:

  • 验证此类顶点是否已存在并为缺失的条目(人员、软件)生成单独的实体
  • 验证边缘是否已经存在(此人与此软件之间)
  • 在它们之间创建一条边

我一直在参考以下主题: CosmosDB Graph : “upsert” query patternAdd edge if not exist using gremlin 试图以某种方式将它们结合起来,但没有取得多大成功。

我尝试了以下方法:

g.V().has('person','name','vadas').
  fold().coalesce(unfold(), addV('person').property('name','vadas')).as('v').
  V().has('software', 'name','ripple').
  fold().coalesce(unfold(), addV('software').property('name','ripple')).
  coalesce(__.inE('created').where(outV().as('v')), addE('created').from('v'))

但它只创建顶点,它们之间没有边。

我也想知道是否有更常见的方法来处理:

1. Upsert entity A and keep a reference to it
2. Upsert entity B and keep a reference to it
3. Upsert entity C and keep a reference to it
....
1. Upsert edge between A and B
2. Upsert edge between A and C

【问题讨论】:

    标签: graph gremlin


    【解决方案1】:

    您有一个减少障碍步骤(即fold()),位于您的步骤标签“v”和您尝试在where() 中检索它的位置之间。请注意在下面的示例中更明确地发生了什么:

    gremlin> g.V().has('person','name','vadas').
    ......1>   fold().coalesce(unfold(), addV('person').property('name','vadas')).as('v').
    ......2>   V().has('software', 'name','ripple').
    ......3>   fold()
    ==>[v[5]]
    gremlin> g.V().has('person','name','vadas').
    ......1>   fold().coalesce(unfold(), addV('person').property('name','vadas')).as('v').
    ......2>   V().has('software', 'name','ripple').
    ......3>   fold().select('v')
    gremlin>
    

    如您所见,您不能select('v')。该遍历器的路径历史已消失。 history is lost 因为您已将流从许多遍历器减少到一个,因此“v”在该合并中丢失了上下文。

    当这种事情发生时,你通常只需要稍微重写你的遍历。在你的情况下,我可能会做这样的事情,因为它会产生最少的变化并很好地保持可读性:

    gremlin> g.V().has('person','name','vadas').
    ......1>   fold().
    ......2>   coalesce(unfold(), addV('person').property('name','vadas')).
    ......3>   V().has('software', 'name','ripple').
    ......4>   fold().
    ......5>   coalesce(unfold(), addV('software').property('name','ripple')).
    ......6>   coalesce(__.inE('created').where(outV().has('person','name','vadas')), 
    ......7>            addE('created').from(V().has('person','name','vadas')))
    ==>e[24][2-created->5]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 2021-11-24
      • 2015-02-07
      • 2019-01-06
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多