如何安排通过CSV导入AWS Neptune的顶点属性的单基数



Neptune文档表示,它们仅在通过CSV导入的属性数据上支持"Set"属性基数,这意味着新到达的属性值不可能覆盖同一顶点、同一属性上的旧属性值。

例如,如果第一个CSV导入

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

然后马尔科有一个生日&第二个CSV导入

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

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

AWS表示,这(折叠Set to Single基数属性(仅保留最后到达的值(需要通过Gremlin遍历进行后处理。

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

在伪Gremlin中,我会想象这样的东西:

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

是否可以保证Set基数属性总是按到达顺序列出?

还是我完全走错了路。

如有任何帮助,我们将不胜感激。

更新:因此,到目前为止,我能想出的最好的办法还远不是一个完美的解决方案,但它可能对我这样的人仍然有用。

在计划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计划是最酷的,但不幸的是它不起作用,它是在一个专用的顶点中不断收集属性值,用epoch时间戳作为属性名称,用属性值作为它们的值:

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经验的人知道解决这个问题的方法。

AWS最近在CSV批量加载程序上引入了"单一"基数支持:https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-format-gremlin.html因此,不需要再进行Gremlin级别的属性值排列。

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

因此,您的gremlin更新查询如下所示。

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

就集合是否是保证订单而言,我不知道(

最新更新