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