Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化从python激发的cypher查询_Python_Neo4j_Cypher - Fatal编程技术网

优化从python激发的cypher查询

优化从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

用于neo4j
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
      才能执行。这意味着我的问题很好。司机有什么问题吗?