Azure cosmosdb 用于覆盖顶点的小精灵查询

Azure cosmosdb 用于覆盖顶点的小精灵查询,azure-cosmosdb,gremlin,Azure Cosmosdb,Gremlin,如何编写gremlin查询哪一个可以 获取现有顶点 删除所有现有属性(显然,id、标签、索引属性等除外) 添加具有值的新属性(主要是字符串) 或者是否有其他方法可以使用gremlin查询覆盖顶点?以TinkerPop modern graph为例: gremlin> g.V().has('person','name','marko').valueMap(true) ==>[id:1,label:person,name:[marko],age:[29]] 假设完全支持Gremlin

如何编写gremlin查询哪一个可以

  • 获取现有顶点
  • 删除所有现有属性(显然,id、标签、索引属性等除外)
  • 添加具有值的新属性(主要是字符串)


  • 或者是否有其他方法可以使用gremlin查询覆盖顶点?

    以TinkerPop modern graph为例:

    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()

    可读性不如
    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]]
    

    谢谢@stephen mallette,你救了我一天副作用()步骤。但是,在我添加
    drop()
    step之前,变通方案一直有效。添加
    drop()
    后,它开始抛出gremlin query compilation error.hmm-它们在可以使用
    drop()
    的地方一定有一些限制。至少有
    sideEffect()
    可用。gtk-谢谢
    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]]