如何仅使用gremlin api将值绑定到顶点属性
我得到了一个带有顶点的图,我需要更新顶点属性 通过将一些字符串写入旧值的末尾(将值追加到旧属性的末尾) 我还需要做它只由gemlin api 我只需要使用api,因为我将查询发送到另一台服务器,在那里执行查询 例如,如果我的问题是“如果不存在,则设置值”-我知道如何做到这一点如何仅使用gremlin api将值绑定到顶点属性,gremlin,tinkerpop,Gremlin,Tinkerpop,我得到了一个带有顶点的图,我需要更新顶点属性 通过将一些字符串写入旧值的末尾(将值追加到旧属性的末尾) 我还需要做它只由gemlin api 我只需要使用api,因为我将查询发送到另一台服务器,在那里执行查询 例如,如果我的问题是“如果不存在,则设置值”-我知道如何做到这一点 traversal.coalesce(__.has(key), __.property(key, value)); 但就我而言,我不能使用这样的东西: Optional<? extends Property<
traversal.coalesce(__.has(key), __.property(key, value));
但就我而言,我不能使用这样的东西:
Optional<? extends Property<Object>> property = traversal.properties(key).tryNext();
if (property.isPresent()) {
Object oldValue = property.get().value();
if (oldValue instanceof String && value instanceof String) {
traversal.property(key, oldValue .toString() + value.toString());
}
} else {
traversal.property(key, value);
}
当然,这有点疯狂,而且我也不能在附加新值之前检查值是否是字符串,在这种情况下
如何解决我的问题?Gremlin还没有字符串操作功能,因此如果不使用lambdas,在Gremlin中不可能做到这一点:
gremlin> g.V().has('person','name','marko').sideEffect{it.get().property('name', it.get().value('name') + 'a')}
==>v[1]
gremlin> g.V().has('person','name','marko')
gremlin> g.V().has('person','name','markoa')
==>v[1]
上面的示例使用TinkerGraph,但是根据您使用的图形数据库,您可能会看到稍微不同的行为,并且可能需要以不同的方式编写lambda以获得相同的结果(例如,我认为这种方法不适用于DS graph,因为我认为您不能调用属性(key,value)顶点上的方法(使用该实现的对象)
显然,您还可以选择在两个单独的遍历中执行此变异:
gremlin> oldVal = g.V().has('person','name','marko').values('name').next()
==>marko
gremlin> oldVal = g.V().has('person','name','marko').property('name',oldVal + 'a')
==>v[1]
gremlin> g.V().has('person','name','marko')
gremlin> g.V().has('person','name','markoa')
==>v[1]
希望在将来的版本中,String
操作函数以及其他特定于类型的操作(如Date
函数)将可用。一些讨论正在进行。Groovy表达式失败:g.V().sideEffect{it.get().property(“def”,it.get().value(“abc”)}
。错误:“Gremlin查询语法错误:不支持的groovy语言规则:'closure'文本:'{it.get().property(“def”,it.get().value(“abc”)}'@第1行,第55.1列错误”“。您使用的是什么图形数据库?我使用的是cosmos DB。正如我在回答中提到的,是否可以采用这种方法取决于您的图形。CosmosDb不支持lambdas。在您的情况下,您看起来只是将一个属性值分配给另一个属性值,在这种情况下,您不需要lambda。CosmosDB可能支持:g.V().property('def',values('abc'))
我已经尝试过了,它给出了:``错误:无法在非基本类型GraphTraversal上创建ValueField```
gremlin> oldVal = g.V().has('person','name','marko').values('name').next()
==>marko
gremlin> oldVal = g.V().has('person','name','marko').property('name',oldVal + 'a')
==>v[1]
gremlin> g.V().has('person','name','marko')
gremlin> g.V().has('person','name','markoa')
==>v[1]