Gremlin查询以覆盖顶点

时间:2019-01-08 09:52:10

标签: azure-cosmosdb gremlin

如何编写将执行的gremlin查询

  1. 获取现有顶点
  2. 删除所有现有属性(显然不包括id,label,index属性等)
  3. 添加具有值的新属性(主要是字符串)

或者有没有其他替代方法可以使用gremlin查询覆盖顶点?

1 个答案:

答案 0 :(得分:1)

以TinkerPop现代图形为例:

gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],age:[29]]

并假设完全支持Gremlin,则可以保留“ name”属性(即index属性),删除所有其他属性,并在Gremlin的一行中添加新属性,如下所示:

gremlin> g.V().has('person','name','marko').
......1>   sideEffect(properties().not(hasKey('name')).drop()).
......2>   property('age',33).
......3>   property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]

但是在CosmosDB中,我认为您尚未支持sideEffect()步骤。诀窍在于,一次遍历就可以做到这一点,即您需要以某种方式“副作用” drop(),并且由于drop()的作用就像过滤器一样,所有步骤都将在此之后添加,根本不执行,因为流中没有剩余可操作的内容。

缺少sideEffect()的一些解决方法包括将union()identity()一起使用:

gremlin> g.V().has('person','name','marko').
......1>   union(properties().not(hasKey('name')).drop(),
......2>         __.identity()).
......3>   property('age',33).
......4>   property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]

sideEffect()的意图可读性差,但有效。我相信CosmosDB支持identity(),即使未在其网站上对其进行记录。我想,如果您没有identity(),就只需要发挥创造力-这是另一种不太好的方法:

gremlin> g.V().has('person','name','marko').as('a').
......1>   union(properties().not(hasKey('name')).drop(),
......2>         select('a')).
......3>   property('age',33).
......4>   property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]