如何修复Python中‘Type Neo4jConnector无run属性’警告
问题解答:Neo4jConnector无run属性警告处理
1. 警告的严重性与修复必要性
这个不是普通警告,是会导致代码崩溃的致命错误,必须修复。
原因很直接:你自定义的Neo4jConnector类里根本没实现run方法,但所有edit_*系列函数里都调用了connector.run(),代码执行到这些地方会直接抛出AttributeError异常,完全无法正常运行编辑规则的功能。
2. 两种可行修复方案
方案一:给Neo4jConnector类添加run方法
在Neo4jConnector类中新增run方法,内部复用driver的session执行查询,和现有创建函数的逻辑保持一致:
class Neo4jConnector: def __init__(self, uri, user, password): self._driver = GraphDatabase.driver(uri, auth=(user, password)) def close(self): self._driver.close() @property def driver(self): return self._driver # 新增run方法 def run(self, query, **kwargs): with self._driver.session() as session: return session.run(query, **kwargs)
方案二:修改所有edit_*函数的实现
把edit_*函数里的connector.run()替换成和创建函数一样的「session+事务」模式,以edit_inbound_rule为例:
def edit_inbound_rule(connector, new_profile_id, new_message, new_processingflag1, s_id): return_name = 'Rule Edit Successfully' query = ( "MATCH (r:Rule) WHERE r.id_name = $s_id " "SET r.profileid = $new_profile_id, " " r.message = $new_message, " " r.processingflag1 = $new_processingflag1 " ) # 替换原connector.run为事务执行逻辑 with connector._driver.session() as session: session.write_transaction(lambda tx: tx.run(query, s_id=s_id, new_profile_id=new_profile_id, new_message=new_message, new_processingflag1=new_processingflag1)) return return_name
其他edit_outbound_rule、edit_both_rule等函数都需要做同样修改,同时还要修正函数内的参数匹配错误(比如edit_outbound_rule的查询用了$id_name,但传参写的是s_id_name=s_id,参数名不匹配)。
3. 额外需要修正的代码问题
除了run方法的问题,代码还有几个明显错误:
- 所有
edit_*函数直接使用全局dict变量获取s_id,逻辑错误,应该把s_id作为参数传入函数。 main函数中调用create_inbound_rule时少传了ruletype参数(末尾多了个逗号,缺必填参数)。get_nodes_by_id_name函数里返回record["node"],但查询返回的是r,应该改成record["r"]。
内容的提问来源于stack exchange,提问作者Kevin Paul Babu
相关产品推荐
相关产品推荐

