2017-04-10 9 views
0

私は2つのサーバーを持っています.1つはneo4jにグラフデータを格納するサーバーで、もう1つのサーバーはETLを実行して毎分neo4jにデータをロードします。Pythonを使用してリモートサーバーからneo4jにデータをロードする方法は?

私の現在の解決策は、forループを使用して(py2neoに基づいて)来るデータの各項目のトランザクションを実行するが、パフォーマンスが非常に遅い、私はまた、neo4jローカルにtmp csvファイルを保存しようとしたサーバを使用し、cypherでload csv構文を使用するとパフォーマンスが大幅に向上しますが、リモートサーバからcsvをロードする方法はわかりません。

だから、私が知りたいのは、dict/list /(pandas dataframe)をneo4jにロードする方法があるかどうかです。バッチインポートを行うロードCSVと同じように、Pythonスクリプトで? 私はneo4jを新しくしました。ありがとうございました。

答えて

0

リモートサーバーからCSVをロードする場合は、HTTPサーバー上のファイルをホストするsimpleHTTPServerなどを実行する必要があります。そして、あなたは単にあなたがパンダのデータフレームからファイルをインポートすることができます一方

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

を使用することができます。私は、線形回帰勾配計算簡単なスクリプトを作成する必要があり、それはここで鍵は、あなたがパラメータを使用してクエリを実行することで、パラメータは(リスト/ dictの/パンダ)

どこから来ることができ

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]}) 

をのNeo4jに戻って保存されます

関連する問題