2014-04-01 42 views
2

我需要運行1000個對象的查詢。使用/batch端點,我可以使這個工作起來,但速度太慢(300個項目30秒)。neo4j - 如何通過其餘api運行1000個對象的查詢

所以我想在此文檔頁面說過同樣的方法:http://docs.neo4j.org/chunked/2.0.1/rest-api-cypher.html#rest-api-create-mutiple-nodes-with-properties

POST這個JSON來http://localhost:7474/db/data/cypher

{ 
    "params": { 
     "props": [ 
      { 
       "_user_id": "177032492760", 
       "_user_name": "John" 
      }, 
      { 
       "_user_id": "177032492760", 
       "_user_name": "Mike" 
      }, 
      { 
       "_user_id": "100007496328", 
       "_user_name": "Wilber" 
      } 
     ] 
    }, 
    "query": "MERGE (user:People {id:{_user_id}}) SET user.id = {_user_id}, user.name = {_user_name} " 
} 

問題是我得到這個錯誤:

{ message: 'Expected a parameter named _user_id', 
    exception: 'ParameterNotFoundException', 
    fullname: 'org.neo4j.cypher.ParameterNotFoundException', 
    stacktrace: 
    ... 

也許這隻適用於CREATE查詢,如文檔頁面所示?

回答

4

使用FOREACH並與有關合並的CREATE SET:

FOREACH (p in {props} | 
    MERGE (user:People {id:{p._user_id}}) 
     ON CREATE user.name = {p._user_name}) 

POST這個JSON來http://localhost:7474/db/data/cypher

{ 
    "params": { 
     "props": [ 
      { 
       "_user_id": "177032492760", 
       "_user_name": "John" 
      }, 
      { 
       "_user_id": "177032492760", 
       "_user_name": "Mike" 
      }, 
      { 
       "_user_id": "100007496328", 
       "_user_name": "Wilber" 
      } 
     ] 
    }, 
    "query": "FOREACH (p in {props} | MERGE (user:People {id:{p._user_id}}) ON CREATE user.name = {p._user_name}) " 
} 
3

實際上,相當於例如在doc是:

{ 
    "params": { 
     "props": [ 
      { 
       "id": "177032492760", 
       "name": "John" 
      }, 
      { 
       "id": "177032492760", 
       "name": "Mike" 
      }, 
      { 
       "id": "100007496328", 
       "name": "Wilber" 
      } 
     ] 
    }, 
    "query": "CREATE (user:People {props})" 
} 

這可能是合法的替代CREATE合併,但該查詢可能不是你所期望的。例如,如果一個ID爲「177032492760」的節點已經存在,但它沒有名稱「John」,那麼MERGE將創建一個新節點;如果節點ID爲「177032492760」你最終會得到2個具有相同ID(但名稱不同)的節點。

+0

我真正需要的唯一具有增量數據的id節點,因爲屬性可能會不同於每個請求。我會試試這個。謝謝! – user3175226

+0

僅供參考:僅使用此CREATE查詢,速度非常快。在2秒內有1000個對象,而CPU/RAM使用率沒有變化。 – user3175226

1

是的,CREATE語句可以拿地圖的數組,其隱式轉換到多條語句每個地圖都有一個地圖,但不能使用超出簡單創建語句的地圖數組。實際上,當您使用MERGEMATCH時,不能以相同方式使用文字地圖。您可以CREATE ({map})但你必須MATCH/MERGE ({prop:{map}.val}

// {props:{name:Fred, age:2}} 
MERGE (a {name:{props}.name}) 
    ON CREATE SET a = {props} 

你的目的或者發送各個參數的地圖,像上面或地圖數組的查詢遍歷它與FOREACH

FOREACH (p IN props | 
    MERGE (user:People {id:p._user_id}) 
     ON CREATE SET user = p) 
相關問題