如何使用python将数据从远程服务器加载到neo4j中?

时间:2017-04-10 10:46:32

标签: neo4j py2neo

我有两台服务器,一台用于neo4j存储图形数据,另一台服务器将运行ETL每分钟将数据加载到neo4j中。

我目前的解决方案是:使用for循环为每个即将到来的数据项(基于py2neo)运行事务,但性能非常慢,我还尝试在neo4j本地服务器中保存tmp csv文件,然后在cypher中使用load csv语法,它将大大提高性能,但我不知道如何从远程服务器加载csv。

所以,我想知道的是,如果有办法将dict / list /(pandas dataframe)加载到neo4j中?就像加载csv在python脚本中进行批量导入一样? 我是neo4j的新手,非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

如果要从远程服务器加载CSV,则需要运行simpleHTTPServer或类似的在HTTPServer上托管文件的东西。然后你可以简单地使用

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

另一方面,您可以从pandas数据框导入文件。我创建了一个简单的脚本来计算线性回归梯度并将其保存回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]})

这里的关键是你运行带参数的查询,参数可以来自任何地方(list / dict / pandas)