Gremlin 小精灵:如何克服属性空值问题并编写一个更新某个顶点的所有属性的查询?

Gremlin 小精灵:如何克服属性空值问题并编写一个更新某个顶点的所有属性的查询?,gremlin,Gremlin,我需要编写一个Gremlin查询来设置顶点的新属性值。所有属性名称都是预先知道的(在本例中:类型、国家/地区、状态)。有些属性值可以为null——我事先不知道是哪一个。查询应适用于所有情况。例如,假设我当前有以下查询: g.V(123). property('Type',Type). property('Country',Country). property('Status',Status) 如果所有参数(类型、国家/地区、状态)值均为非空,则此查询工作正常。例如,如果Country为null

我需要编写一个Gremlin查询来设置顶点的新属性值。所有属性名称都是预先知道的(在本例中:类型、国家/地区、状态)。有些属性值可以为null——我事先不知道是哪一个。查询应适用于所有情况。例如,假设我当前有以下查询:

g.V(123).
property('Type',Type).
property('Country',Country).
property('Status',Status)
如果所有参数(类型、国家/地区、状态)值均为非空,则此查询工作正常。例如,如果Country为null,则我会得到一个错误:

AddPropertyStep没有提供的值:AddPropertyStep({key=[Country]})

在这种情况下,我需要使用不同的查询来删除属性(顺便问一下,有没有更好的方法删除属性?)

是否可以编写一个可以同时处理空值和非空值的通用查询?我不能使用控制台或编程,只能执行一个小精灵查询


谢谢

TinkerPop不允许在属性中使用
null
值(尽管我想您可能会发现一些图形数据库允许不同的语义),因此您应该提前验证数据,以确保它具有一些有意义的“空值”,而不是
null
。如果由于某种原因您不能这样做,我想您可以使用
choose()
步骤“检查空值”:


对“is null”的检查基本上只是:
constant(age).count().is(0)
,它依赖于Gremlin的语义,即流中的
null
值为空,并给出
count()
为零。这是可行的,但它会让你的小精灵不那么可读。如果你必须写很多,那么这可能是一个很好的补充。

这很好,非常感谢!然后,查询将如下所示。它似乎工作得很好。可以简化吗<代码>g.V(123).选择(常量(类型).计数()是(0),可选(属性('Type').drop()),属性('Type',Type)).选择(常量(状态).计数()是(0)…我不确定你的例子中的“简化”是什么意思,尽管你可能正确地使用了
可选()
,这样你就可以在末尾链接更多的步骤作为
drop()
的行为就像一个过滤步骤,会杀死所有的遍历程序。使用
sideEffect()
而不是
optional()
可能更具可读性,不过……至少这是我的首选。
g.V(123).
property('Type',Type).
property('Status',Status).
properties('Country').drop()
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko],age:[29]]
gremlin> age = null
gremlin> g.V().has('person','name','marko').choose(constant(age).count().is(0), properties('age').drop(),property('age',age))
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko]]
gremlin> age = 30
==>30
gremlin> g.V().has('person','name','marko').choose(constant(age).count().is(0), properties('age').drop(),property('age',age))
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko],age:[30]]