Gremlin查询异常咨询:select/by报错但properties()正常及双查询差异
关于Gremlin查询的两个问题解答
问题1:为什么select/by查询报错,properties()却能正常返回?
这种情况最常见的原因是**select引用了未定义的标记**,或者by的使用不符合语法规则:
- 比如你如果写了
g.V().hasLabel('person').select('name'),这会直接报错——因为select需要先通过as()步骤给路径中的元素打标记,正确写法应该是g.V().hasLabel('person').as('p').select('p').by('name')。而properties('name')是直接从顶点上获取指定属性,不需要提前打标记,所以只要顶点存在(哪怕属性不存在,也会返回空而不是报错),就能正常执行。 - 另一种可能是
by的参数错误,比如你用by()访问了一个不存在的属性或无效的遍历器,而properties()在属性不存在时只会返回空结果,不会抛出错误。举个例子:g.V().as('p').select('p').by('non_existent_prop')会因为属性不存在报错,但g.V().properties('non_existent_prop')只会返回空集合,不会触发错误。
问题2:TinkerPop示例图上第一个查询正常返回空结果,第二个却报错?
结合你提到的“已将by修改为as”的细节,大概率是第二个查询存在语法错误或者引用了未定义的标记:
- 比如第一个查询是
g.V().has('name', '不存在的名字'),这种查询会正常返回空结果,因为只是没有匹配到数据,语法本身是正确的。 - 而第二个查询如果是类似
g.V().as('a').select('b'),就会报错——因为你只给顶点打了a的标记,却试图select不存在的b标记;或者如果是之前错误地写了g.V().by('name'),这也是语法错误,因为by()必须配合select、project、group等步骤使用,不能直接跟在V()后面。 - 还有一种可能是你在修改时出现了语法混乱,比如把
as和by的位置搞反,导致遍历器无法正确解析,进而抛出错误。
内容的提问来源于stack exchange,提问作者Glide
相关产品推荐
相关产品推荐

