在 Gremlin 查询闭包中检索单个 属性 值有效,但检索 valueMap() 失败会产生异常

Retrieving single property value in Gremlin query closure works, but retrieving valueMap() fails yields Exception

使用 Titan 1.0.0 Gremlin shell 我可以从闭包中的边检索单个 属性 值。但是尝试访问 valueMap() 失败并出现异常。

作品:

gremlin> t.E().hasLabel("TRUSTS").has('NOT_VALID_BEFORE').each( { trustEdge -> t.E().has('EDGE_GROUP_ID', trustEdge.value('EDGE_GROUP_ID')).hasNot('NOT_VALID_BEFORE').each({println it.value('EDGE_ID')}) } )

产生异常(唯一的区别在于最右边的闭包 'it.valueMap()' 与 'it.value('..')'):

gremlin> t.E().hasLabel("TRUSTS").has('NOT_VALID_BEFORE').each( { trustEdge -> t.E().has('EDGE_GROUP_ID', trustEdge.value('EDGE_GROUP_ID')).hasNot('NOT_VALID_BEFORE').each( { println it.valueMap() } ) } )
No signature of method: com.thinkaurelius.titan.graphdb.relations.StandardEdge.valueMap() is applicable for argument types: () values: []
Possible solutions: value(java.lang.String)
Display stack trace? [yN]
gremlin> 

但并不是一般情况下我无法到达边缘的valueMap:

gremlin> t.E().hasLabel("TRUSTS").has('NOT_VALID_BEFORE').each( { trustEdge -> t.E().has('EDGE_GROUP_ID', trustEdge.value('EDGE_GROUP_ID')).hasNot('NOT_VALID_BEFORE').each( { println it } ) } )
e[215rmh-oe094-1d05-9i0][40964296-MANAGED->12312]
gremlin> t.E('215rmh-oe094-1d05-9i0').valueMap()
==>[MANAGE_INFORM:false, NOT_VALID_AFTER:1669873006000, MANAGE_MANAGERS:false, MANAGE_AUTHENTICATION_MEANS:true, CREATED_AT:1487683094863, RELATIONSHIP_ROLE:FAMILY_DOCTOR, MANAGE_TRUST:true, UPDATED_AT:1487683094915, MANAGE_REPRESENTATION:false, EDGE_ID:122881049, VERIFIED:true, EDGE_GROUP_ID:122881049]

这是一个错误还是我做错了什么?

一些上下文,以防万一查询甚至没有按照我的想法执行: 我想我在这里做的是查找带有标签 "TRUSTS" 且具有 属性 NOT_VALID_BEFORE 的所有边。对于这些边中的每一个,我查找共享相同边组 ID 值的所有边,并检查它们是否也有 属性 NOT_VALID_BEFORE,将那些没有 [=33= 的边打印到控制台] 设置。

当您开始使用 each() 进行迭代时,您在闭包内操作的每个项目都是 "off the traversal" -- 也就是说,您使用的是 Edge 对象,而不是 GraphTraversal对象。

Edge has a value() method similar to the GraphTraversal, but it does not have a valueMap() method. You could use ElementHelper.propertyValueMap() 代替。

这是一个简单的例子:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.E().valueMap()
==>[weight:0.5]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:0.2]
gremlin> g.E().each{ edge -> println ElementHelper.propertyValueMap(edge) };[]
[weight:0.5]
[weight:1.0]
[weight:0.4]
[weight:1.0]
[weight:0.4]
[weight:0.2]