优化从python激发的cypher查询
用于neo4j优化从python激发的cypher查询,python,neo4j,cypher,Python,Neo4j,Cypher,用于neo4jforpython的驱动程序。我有一个程序,可以动态创建大约10-12个查询。所有查询的最终结果都收集在list`中并返回 以下是10个此类问题: MATCH (sslc:subSubLocality)-[:CHILD_OF]->(v4)-[:CHILD_OF]->(v3)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = 'abcState') AND (sslc.name_wr
for
python的驱动程序。我有一个程序,可以动态创建大约10-12个查询。所有查询的最终结果都收集在
list`中并返回
以下是10个此类问题:
MATCH (sslc:subSubLocality)-[:CHILD_OF]->(v4)-[:CHILD_OF]->(v3)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = 'abcState') AND (sslc.name_wr= 'xyzSLC' OR sslc.name_wr= 'abcxyzcolony') RETURN st, sslc, v4, v3, v2
MATCH (slc:subLocality)-[:CHILD_OF]->(v3)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = 'abcState') AND (slc.name_wr= 'xyzSLC' OR slc.name_wr= 'abcxyzcolony') RETURN st, slc, v3, v2
MATCH (loc:locality)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = 'abcState') AND (loc.name_wr= 'deltax' OR loc.name_wr= 'xyzSLC' OR loc.name_wr= 'abcxyzcolony') RETURN st, loc, v2
MATCH (ct:city)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = 'abcState') AND (ct.name_wr= 'deltax' OR ct.name_wr= 'abcxyz') RETURN st, ct
MATCH (sslc:subSubLocality)-[:CHILD_OF]->(v3)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(ct:city) WHERE (ct.name_wr = 'deltax' OR ct.name_wr = 'abcxyz') AND (sslc.name_wr= 'xyzSLC' OR sslc.name_wr= 'abcxyzcolony') RETURN ct, sslc, v3, v2
MATCH (slc:subLocality)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(ct:city) WHERE (ct.name_wr = 'deltax' OR ct.name_wr = 'abcxyz') AND (slc.name_wr= 'xyzSLC' OR slc.name_wr= 'abcxyzcolony') RETURN ct, slc, v2
MATCH (loc:locality)-[:CHILD_OF]->(ct:city) WHERE (ct.name_wr = 'deltax' OR ct.name_wr = 'abcxyz') AND (loc.name_wr= 'deltax' OR loc.name_wr= 'xyzSLC' OR loc.name_wr= 'abcxyzcolony') RETURN ct, loc
MATCH (sslc:subSubLocality)-[:CHILD_OF]->(v2)-[:CHILD_OF]->(loc:locality) WHERE (loc.name_wr = 'deltax' OR loc.name_wr = 'xyzSLC' OR loc.name_wr = 'abcxyzcolony') AND (sslc.name_wr= 'xyzSLC' OR sslc.name_wr= 'abcxyzcolony') RETURN loc, sslc, v2
MATCH (slc:subLocality)-[:CHILD_OF]->(loc:locality) WHERE (loc.name_wr = 'deltax' OR loc.name_wr = 'xyzSLC' OR loc.name_wr = 'abcxyzcolony') AND (slc.name_wr= 'xyzSLC' OR slc.name_wr= 'abcxyzcolony') RETURN loc, slc
MATCH (sslc:subSubLocality)-[:CHILD_OF]->(slc:subLocality) WHERE (slc.name_wr = 'xyzSLC' OR slc.name_wr = 'abcxyzcolony') AND (sslc.name_wr= 'xyzSLC' OR sslc.name_wr= 'abcxyzcolony') RETURN slc, sslc
查询可能会根据输入字典发生变化(正如我提到的,查询是在运行时创建的)。但是查询共享相同的结构
下面是我得到的查询计划
,它对于所有查询都保持不变,只是内部的值不同
下面是激发这些请求的代码:
def get_query_response(query_list: list)-> list:
driver = GraphDatabase.driver(uri, auth=("neo4j", "neo4j"))
with driver.session() as session:
with session.begin_transaction() as tx:
response = [record.values() for query in query_list for record in tx.run(query)]
return response
query\u列表
是包含这些查询的str
的集合
问题是整个任务需要2秒钟才能给出响应。是否有任何方法可以优化查询或使其更快,或者在毫秒内运行
编辑:
回答几个问题:
- 是的,提到的时间是获取结果所需的时间。我已经把它缩小了
- 查询大约从
3ms
-10ms
执行。当我在neo4j
桌面上启动查询时。是司机引起了问题吗
- 是的,这是一个本地托管的neo4j数据库,我的系统是带有1TB SSD的i7 16GB内存
- 不,我没有创建
indices
现在我有了500ms
的性能提升,但是现在它是1.5s
有什么方法可以在毫秒内推动它工作吗
添加适当的or,以便生成的查询无需扫描适当的节点即可开始工作
例如(根据您的示例),您可以将索引添加到:
:次分区(名称\u wr)
:子局部性(名称\u wr)
:地点(名称)
:城市(名称)
我不能确定原因是什么,但我有几个问题可以帮助我们更接近答案
•您是否尝试过分别对这些查询进行基准测试?乍一看,它们看起来很简单,可以完成,所以我不认为这是问题所在,但知道您是否真的需要优化查询本身也不会有什么坏处
•您提到需要“2秒”,是从您点击“回车”执行Python脚本的那一刻起(因此包括启动到Neo4j实例的连接),还是执行查询需要2.0秒
•在Neo4j的v3.2之前,Cypher planner并不总是做出最有效的选择。如果您有一个早期版本,文档中提到您应该默认使用基于成本的计划器
•这是本地Neo4j实例吗?如果是托管的,主机的硬件规格是什么?如果可能的话,增加规格可能不会有什么坏处
•如果您没有添加任何自定义项,并且您的查询看起来总是一样的,我建议您研究该选项。此外,您的Python代码是否经过优化?它的订婚时间是2秒吗?您可以在python和Neo4j服务器上隔离时间。要了解发出任何请求的开销,请尝试更改
query\u list
以仅包含以下简单查询:RETURN 123代码>。这需要多长时间?@cybersam有趣地推出了回应。查询仍然需要1s
才能执行。这意味着我的问题很好。司机有什么问题吗?