2017-04-10 47 views
0

我有兩個服務器,一個是neo4j存儲圖形數據,另一個服務器運行ETL,每分鐘將數據加載到neo4j。我現在的解決方案是:使用for循環爲每個數據項目(基於py2neo)運行事務,但性能非常慢,我也嘗試在neo4j本地保存一個tmp csv文件服務器,然後在cypher中使用load csv語法,它會提高性能很多,但我不知道如何從遠程服務器加載csv。如何使用python將數據從遠程服務器加載到neo4j中?

所以,我想知道的是,如果有一種方法可以將dict/list /(pandas dataframe)加載到neo4j中?就像加載CSV進行批量導入,在Python腳本? 我是neo4j的新手,非常感謝您的幫助。

回答

0

如果要從遠程服務器加載CSV,則需要運行一個簡單的HTTPServer或類似的HTTPServer上託管文件。然後,你可以簡單地使用

LOAD CSV FROM "http://192.x.x.x/myfile.csv" as row

在另一方面,你可以從熊貓數據幀導入文件。我創建一個計算線性迴歸梯度一個簡單的腳本,並將其保存回Neo4j的

from neo4j.v1 import GraphDatabase 
import pandas as pd 
import numpy as np 
driver = GraphDatabase.driver("bolt://192.168.x.x:7687", auth=("neo4j", "neo4j")) 
session = driver.session() 

def weekly_count_gradient(data): 
    df = pd.DataFrame([r.values() for r in data], columns=data.keys()) 
    df["week"] = df.start.apply(lambda x: pd.to_datetime(x).week if pd.notnull(x) else None) 
    df["year"] = df.start.apply(lambda x: pd.to_datetime(x).year if pd.notnull(x) else None) 
    group = df.groupby(["week","year","company"]).start.count().reset_index() 
    for name in group["company"].unique(): 
     if group[group["company"] == name].shape[0] >= 5: 
      x = np.array([i[1] if i[0] == 2016 else i[1] + 52 for i in group[group.company == name][["year","week"]].values]) 
      y = group[group.company == name]["start"].values 
      fit = np.polyfit(x,y,deg=1)  
      update = session.run("MATCH (a:Company{code:{code}}) SET a.weekly_count_gradient = toFLOAT({gradient}) RETURN a.code,{"code":name,"gradient":fit[0]}) 

這裏的關鍵是,你運行一個帶參數的查詢,參數可以來自任何地方(列表/字典/熊貓)

相關問題