【问题标题】:How do i arrange Single cardinality for Vertex properties imported via CSV into AWS Neptune?如何为通过 CSV 导入 AWS Neptune 的 Vertex 属性安排单基数?
【发布时间】:2018-11-16 15:29:09
【问题描述】:

Neptune 文档称,它们仅在通过 CSV 导入的属性数据上支持“设置”属性基数,这意味着新到达的属性值无法覆盖同一属性上同一顶点上的旧属性值。

例如,如果第一个 CSV 导入

~id,~label,age
Marko,person,29

然后 Marko 有一个生日和第二个 CSV 导入

~id,~label,age
Marko,person,30

'Marko' 顶点'age' 属性将包含两个年龄值,这似乎没有用。

AWS 说这(折叠设置为单一基数属性(仅保留最后到达的值)需要通过 Gremlin 遍历进行后处理。

这是否意味着应该有一个遍历,不断扫描具有多个(设置)属性的顶点并再次使用单基数设置属性,最后一个值可能?如果是这样,那么执行此操作的最佳 Gremlin 查询是什么?

在伪 Gremlin 中,我会想像:

g.V().property(single, properties(*), _.tail())

是否可以保证 Set-cardinality 属性始终按到达顺序列出?

或者我完全走错了路。

任何帮助将不胜感激。

更新: 所以到目前为止我能想到的最好的事情还远不是一个完美的解决方案,但它仍然可能对我的鞋子有用。

在计划 A 中,如果我们碰巧知道属性名称并且到达顺序根本不重要(只需要这些道具上的单一基数),所有顶点的遍历可能是这样的:

g.V().has(${propname}).where(property(single, ${propname}, properties(${propname}).value().order().tail() ) )

方案B是在同一顶点(例如以_开头)的临时属性名称下收集新的属性值,并遍历具有该临时属性名称的顶点并将原始属性设置为具有单基数的尾值:

g.V().has(${temp_propname}).where(property(single, ${propname}, properties(${temp_propname}).value().order().tail() ) ).properties('temp_propname').drop()

C 计划是最酷的,但不幸的是不起作用,它是在专用顶点中继续收集属性值,以纪元时间戳作为属性名称,并将属性值作为它们的值:

g.V(${vertexid}).out('has_propnames').properties()
==>vp[1542827843->value1]
==>vp[1542827798->value2]
==>vp[1542887080->latestvalue]

并对属性名称(键)进行排序,取最后一个,并使用它的值来保持主顶点属性值与最新值保持同步:

g.V().has(${propname}).where(out(${has_these_properties}).count().is(gt(0))).where(property(single, ${propname}, out(${has_these_properties}).properties().value(  out(${has_these_properties}).properties().keys().order().tail()  ) ) )

看起来 value() 步骤的参数必须是常量,它不能使用另一个遍历的结果作为参数,所以我无法让它工作。也许有更多 Gremlin 经验的人知道解决此问题的方法。

【问题讨论】:

    标签: amazon-web-services csv gremlin cardinality amazon-neptune


    【解决方案1】:

    AWS 最近在 CSV 批量加载程序上引入了“单一”基数支持: https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-format-gremlin.html 所以不再需要 Gremlin 级别的财产价值安排。

    【讨论】:

      【解决方案2】:

      读取要批量加载的文件并使用顶点 id 设置该属性可能会更高效,而不是扫描具有该属性的多个值的顶点。

      所以你的 gremlin 更新查询如下。

      g.V(${id})
       .property(single,${key},${value})
      

      至于 set 是否是保证顺序,我不知道。 :(

      【讨论】:

      • 感谢您的回答!问题是我的设置中的顶点到达速度非常快,每分钟包含超过 100.000 个顶点的 CSV 到达(并在 2-3 秒内得到处理,因此工作速度非常快),而这仅仅是开始。另一方面,我看到 gremlin 查询在 10-1000 毫秒范围内完成,所以我担心如果我开始按每个顶点的 id 在该卷中逐个发送属性更新 gremlin 查询,我可能会有大量积压没时间。
      • 是的,如果没有进一步优化,它可能跟不上。您可能会认为,由于它们允许在批量加载标头中区分单个类型和数组类型,因此它将成为 Single 与 Set 的因素。如果有足够多的人要求,也许会推出更新的版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多