使用gremlin_python的client实例时报'NoneType无processor属性'错误如何解决?
问题场景
我使用Jupyter Notebook对Neptune Database执行gremlin查询,先从MySQL数据库获取信息生成gremlin查询字符串,再通过gremlin_python库的Client模块执行,相关代码如下:
def getConnectionWithNeptuneGraphDB(): global clientt if clientt is not None: print('clientt instance is available') else: print('clientt is not available') clientt = client.Client('neptune_db_endpoint', 'g') return clientt # 创建Person节点的函数 def createPersonNode(): personsInfo = getPersonInformation(companyIdTouple) print(personsInfo) personGremQry = queryToCreatePersonNode(personsInfo) clientt = getConnectionWithNeptuneGraphDB() clientt.submit(personGremQry) #print(personsInfo) print('Person Node created successfully') def main(): # 创建Company节点流程 createCompanyNode() # 创建Person节点流程 createPersonNode() connection.close() clientt.close()
main()函数为入口点,执行时createCompanyNode()运行正常,可成功将公司数据写入数据库,但执行createPersonNode()时会抛出如下错误,即便单独执行createPersonNode()也会出现相同报错:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-558-263240bbee7e> in <module> ----> 1 main() <ipython-input-557-e622c1b6eefc> in main() 1 def main(): 2 #createCompanyNode() ----> 3 createPersonNode() 4 connection.close() 5 clientt.close() <ipython-input-550-60763852d6da> in createPersonNode() 16 personGremQry = queryToCreatePersonNode(personsInfo) 17 clientt = getConnectionWithNeptuneGraphDB() ---> 18 clientt.submit(personGremQry) 19 #print(personsInfo) 20 print('Person Node created successfully') ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/site-packages/gremlin_python/driver/client.py in submit(self, message, bindings, request_options) 128 129 def submit(self, message, bindings=None, request_options=None): --> 130 return self.submitAsync(message, bindings=bindings, request_options=request_options).result() 131 132 def submitAsync(self, message, bindings=None, request_options=None): ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/concurrent/futures/_base.py in result(self, timeout) 423 raise CancelledError() 424 elif self._state == FINISHED: --> 425 return self.__get_result() 426 427 self._condition.wait(timeout) ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/concurrent/futures/_base.py in __get_result() 382 def __get_result(self): 383 if self._exception: --> 384 raise self._exception 385 else: 386 return self._result ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/site-packages/gremlin_python/driver/connection.py in cb(f) 64 def cb(f): 65 try: --- > 66 f.result() 67 except Exception as e: 68 future.set_exception(e) ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/concurrent/futures/_base.py in result(self, timeout) 423 raise CancelledError() 424 elif self._state == FINISHED: --> 425 return self.__get_result() 426 427 self._condition.wait(timeout) ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/concurrent/futures/_base.py in __get_result() 382 def __get_result(self): 383 if self._exception: --> 384 raise self._exception 385 else: 386 return self._result ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/concurrent/futures/thread.py in run(self) 54 55 try: --- > 56 result = self.fn(*self.args, **self.kwargs) 57 except BaseException as exc: 58 self.future.set_exception(exc) ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/site-packages/gremlin_python/driver/protocol.py in write(self, request_id, request_message) 72 def write(self, request_id, request_message): 73 message = self._message_serializer.serialize_message( --- > 74 request_id, request_message) 75 self._transport.write(message) 76 ~/anaconda3/envs/JupyterSystemEnv/lib/python3.6/site-packages/gremlin_python/driver/serializer.py in serialize_message(self, request_id, request_message) 134 135 def serialize_message(self, request_id, request_message): --> 136 processor = request_message.processor 137 op = request_message.op 138 args = request_message.args AttributeError: 'NoneType' object has no attribute 'processor'
问题原因与解决方案
这个错误是client.submit()方法接收到的输入无法被解析为合法的gremlin请求,导致内部生成了空的请求消息对象,访问processor属性时触发报错,可按以下步骤排查解决:
- 首先检查
queryToCreatePersonNode(personsInfo)的返回值:在生成personGremQry后添加打印语句print(type(personGremQry), personGremQry),如果返回值为None,说明查询生成函数逻辑存在问题,没有正确返回构造完成的gremlin语句,修复生成逻辑返回合法字符串即可。 - 如果返回值为字符串,检查字符串语法是否正确:从MySQL取出的人员信息如果包含未转义的单引号、双引号、换行符等特殊字符,会导致构造的gremlin语句语法损坏。可以把打印出来的查询字符串直接放到Neptune控制台执行,验证是否能正常运行,若控制台执行也报错,就先修复查询语法,对特殊字符做转义处理。
- 检查gremlin_python版本兼容性:部分旧版本gremlin_python和新版Neptune服务端存在兼容问题,若以上两点都排查无问题,可以升级gremlin_python到和Neptune服务端匹配的稳定版本,比如3.4.x或3.5.x系列。
- 额外优化建议:当前全局复用client的写法存在连接失效的隐患,推荐每次使用后关闭连接,或者用连接池方式管理连接,避免偶发的连接异常问题。
内容的提问来源于stack exchange,提问作者Ranjit Soni
相关产品推荐
相关产品推荐

