我需要编写一个可以设置顶点的新属性值的 Gremlin 查询。所有的属性名称都是预先知道的(在这个例子中:类型、国家、状态)。某些属性值可以为 null - 我事先不知道哪些值。查询应该适用于所有情况。例如,假设我目前有这个查询:
g.V(123).
property('Type',Type).
property('Country',Country).
property('Status',Status)
如果所有参数(类型、国家/地区、状态)值都为非空,则此查询工作正常。如果说 Country 为空,我会收到一个错误:The AddPropertyStep does not have a provided value: AddPropertyStep({key=[Country]})
在这种情况下,我需要使用不同的查询来删除属性(顺便说一下,有没有更好的方法来删除属性?):g.V(123).
property('Type',Type).
property('Status',Status).
properties('Country').drop()
是否可以编写一个可以处理空值和非空值的通用查询?我不能使用控制台或编程,只能执行一个 Gremlin 查询。谢谢!
最佳答案
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]]
“为空”的检查基本上只是:
constant(age).count().is(0)
,它依赖于 null
的 Gremlin 语义流中的值为空并给出 count()
零。它有效,但它使您的 Gremlin 可读性稍差。那可能是个好消息 DSL step如果您必须写很多,请添加。
关于Gremlin:如何克服属性空问题并编写更新某个顶点的所有属性的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55864376/