格林林:如何克服属性为空的问题,并编写查询来更新某个顶点的所有属性?

时间:2019-04-26 09:13:22

标签: gremlin

我需要编写一个Gremlin查询,该查询可以设置顶点的新属性值。所有属性名称都是预先已知的(在此示例中:Type,Country,Status)。一些属性值可以为null-我不知道事先知道哪个。该查询应适用于所有情况。例如,假设我当前有此查询:

g.V(123). property('Type',Type). property('Country',Country). property('Status',Status)

如果所有参数(“类型”,“国家/地区”,“状态”)值都不为空,则此查询工作正常。如果说“国家/地区”为空,则会出现错误:

The AddPropertyStep does not have a provided value: AddPropertyStep({key=[Country]})

在这种情况下,我将需要使用其他查询来删除属性(顺便说一句,是否有更好的方法删除属性?):

g.V(123). property('Type',Type). property('Status',Status). properties('Country').drop()

是否可以编写一个既可以处理null值又可以处理非null值的通用查询?我不能使用控制台或编程,只能执行一个Gremlin查询。

谢谢!

1 个答案:

答案 0 :(得分:0)

TinkerPop不允许在属性中使用null值(我想,尽管您可能会在其中找到一些允许不同语义的图数据库),所以您应该预先验证数据以确保其具有一些有意义的“空”值”,而不是null。如果由于某些原因您无法执行此操作,我想您可以使用choose()步骤“检查是否为空”:

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]]

对“ is null”的检查基本上只是:constant(age).count().is(0),它依赖于Gremlin的语义,即流为空并且给出null为零的count()值。它可以工作,但是会使您的Gremlin的可读性降低。如果必须写很多,这可能是一个不错的DSL step