我需要编写一个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查询。
谢谢!
答案 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。