使用gremlinpython==3.7.0查询非空结果时返回unhashable type: 'list'求助
解决GremlinPython 3.7.0连接Cosmos DB时非空结果查询报“unhashable type: 'list'”的问题
问题现象
使用gremlinpython==3.7.0连接Azure Cosmos DB Gremlin API时:
- 无匹配结果的查询(如
g.V().has('label','notareallabel'))可正常返回空列表[] - 有匹配结果的查询(如
g.V().has('label','tank'))执行results.all().result()时会触发unhashable type: 'list'错误,但该查询在Azure门户中能正常返回节点
解决方案
这个问题源于GremlinPython 3.7.x系列与Cosmos DB Gremlin API的序列化兼容性问题,以下是几种可行的解决办法:
1. 降级GremlinPython版本
GremlinPython 3.7.x和Cosmos DB存在已知兼容性问题,降级到3.6.5版本可直接解决该错误:
pip install gremlinpython==3.6.5
降级后重新执行查询,非空结果即可正常返回。
2. 自定义结果迭代逻辑(不降级版本)
若无法降级版本,可通过逐个迭代结果、转换数据类型来规避哈希问题,替代all().result()的调用:
query = "g.V().has('label','tank')" results = c.submit(query) res = [] for item in results: # 将节点对象转为字典,避免list类型的哈希冲突 res.append(dict(item))
3. 检查容器索引配置
虽然查询在门户能正常执行,但异常的索引配置可能导致返回结果结构异常,触发客户端序列化错误。确保容器索引策略包含查询用到的字段(如label)的索引规则。
验证示例
修改后可通过以下代码验证效果:
from gremlin_python.driver import client, serializer # 替换为你的Cosmos DB配置 c = client.Client( "wss://<你的CosmosDB账户>.gremlin.cosmos.azure.com:443/", "g", username="/dbs/<数据库名>/colls/<容器名>", password="<你的主键>", message_serializer=serializer.GraphSONSerializersV2d0() ) # 执行有结果的查询 query = "g.V().has('label','tank')" results = c.submit(query) res = results.all().result() print(res)
内容的提问来源于stack exchange,提问作者billmanH
相关产品推荐
相关产品推荐

