gremlin_python执行filter查询报GraphTraversal对象不可调用错误
问题原因
触发'GraphTraversal' object is not callable报错的核心原因是gremlin_python的匿名遍历语法和Gremlin控制台有差异:
在Gremlin控制台中,可以直接在遍历嵌套位置写count()、properties()这类步骤作为匿名遍历;但在gremlin_python中,所有不绑定在起始遍历源g上的匿名遍历步骤,都必须通过双下划线__(匿名遍历对象)发起,直接裸写导入的遍历方法名时,导入的名称本身是GraphTraversal类的实例,加括号调用就会触发「对象不可调用」的类型错误。
修复步骤
- 先补全必要的导入项,其中
__是gremlin_python提供的匿名遍历入口:
from gremlin_python.process.traversal import gt, local, keys, values from gremlin_python.process.graph_traversal import __
- 把代码中所有嵌套位置裸写的遍历步骤,前面加上
__.前缀,注意gt、local、keys、values这类断言、枚举值不需要加前缀。
修正后可运行代码
g.V().has('id', 12345) \ .fold().filter(__.count(local).is_(gt(1))).unfold() \ .sideEffect(__.properties().group("p").by(__.key()).by(__.value())) \ .sideEffect(__.outE().group("o").by(__.label()).by( __.project("p","iv").by(__.valueMap()).by(__.inV()).fold() )) \ .sideEffect(__.inE().group("i").by(__.label()).by( __.project("p","ov").by(__.valueMap()).by(__.outV()).fold() )) \ .sideEffect(__.drop()) \ .cap("p","o","i").as_("poi") \ .addV("User").as_("u") \ .sideEffect( __.select("poi").select("p").unfold().as_("kv") .select("u").property(__.select("kv").select(keys), __.select("kv").select(values)) ) \ .sideEffect( __.select("poi").select("o").unfold().as_("x").select(values) .unfold().addE(__.select("x").select(keys)).from_(__.select("u")).to(__.select("iv")) ) \ .sideEffect( __.select("poi").select("i").unfold().as_("x").select(values) .unfold().addE(__.select("x").select(keys)).from_(__.select("ov")).to(__.select("u")) ).iterate()
注意:
keys、values是遍历用的枚举值,直接从traversal模块导入即可,不要写成__.keys()/__.values(),否则会触发语法错误。
内容的提问来源于stack exchange,提问作者d95l
相关产品推荐
相关产品推荐

