簡體   English   中英

優化從python觸發的密碼查詢

[英]optimize cypher query fired from python

司機for Neo4j的for蟒蛇. I have a program that dynamically creates around 10-12 queries . The final result from all queries is collected in a . I have a program that dynamically creates around 10-12 queries . The final result from all queries is collected in a . I have a program that dynamically creates around 10-12 queries . The final result from all queries is collected in a 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

查詢可能會根據輸入字典進行更改(正如我提到的,查詢是在運行時創建的)。 但是查詢共享相同的結構。

下面是我得到的一個Query Plan ,它對所有查詢都保持相同,只是內部值不同。

查詢1

以下是觸發這些請求的代碼:

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_list是具有這些查詢的str的集合。

問題是整個任務需要2秒鍾才能做出響應。 有什么方法可以優化查詢或使其更快,或者可以在幾毫秒內運行?


編輯:

要回答幾個問題:

  • 是的,提到的時間是獲取結果所需的時間。 我已經事先縮小了范圍。
  • 執行查詢大約需要3 10ms 3ms 10ms 當我在neo4j桌面上neo4j查詢時。 是引起問題的驅動程序嗎?
  • 是的,它是一個本地托管的neo4j數據庫,我的系統是i7 16GB Memory with 1TB SSD
  • 不,我現在沒有創建indeices ,但500ms的性能卻有所提高,但是現在是1.5s ,有什么辦法可以使它在毫秒內工作嗎?

添加適當的索引唯一性約束,以便您生成的查詢無需掃描適當的節點即可開始工作。

例如(基於您的示例),您可以將索引添加到:

  • :subSubLocality(name_wr)
  • :subLocality(name_wr)
  • :locality(name_wr)
  • :city(name_wr)

我不能確定原因是什么,但是我有幾個問題可以幫助我們更接近答案。

•您是否嘗試過分別對這些查詢進行基准測試? 乍一看,它們看起來很簡單,可以完成,所以我不認為這是問題所在,但是知道您是否真的需要自己優化查詢也不會有任何問題。

•您提到需要2秒鍾,或者是從您單擊“輸入”以執行Python腳本起(因此包括了啟動與Neo4j實例的連接之類的事情),或者是專門花了2.0秒鍾進行查詢執行?

文檔指出,在Neo4j v3.2之前,Cypher規划器並非總是做出最有效的選擇。 如果您使用的是較早的版本,則文檔中會提到您應默認使用基於成本的計划程序。

•這是本地Neo4j實例嗎? 如果是托管主機,則主機的硬件規格是什么? 如果可能的話,提高規格可能不會受到傷害。

•如果您尚未在屬性上添加任何自定義索引,並且您的查詢始終看起來相同,則建議您查看該選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM