Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅使用gremlin api将值绑定到顶点属性_Gremlin_Tinkerpop - Fatal编程技术网

如何仅使用gremlin api将值绑定到顶点属性

如何仅使用gremlin api将值绑定到顶点属性,gremlin,tinkerpop,Gremlin,Tinkerpop,我得到了一个带有顶点的图,我需要更新顶点属性 通过将一些字符串写入旧值的末尾(将值追加到旧属性的末尾) 我还需要做它只由gemlin api 我只需要使用api,因为我将查询发送到另一台服务器,在那里执行查询 例如,如果我的问题是“如果不存在,则设置值”-我知道如何做到这一点 traversal.coalesce(__.has(key), __.property(key, value)); 但就我而言,我不能使用这样的东西: Optional<? extends Property<

我得到了一个带有顶点的图,我需要更新顶点属性 通过将一些字符串写入旧值的末尾(将值追加到旧属性的末尾)

我还需要做它只由gemlin api

我只需要使用api,因为我将查询发送到另一台服务器,在那里执行查询

例如,如果我的问题是“如果不存在,则设置值”-我知道如何做到这一点

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]