微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Neo4j 中创建数据库需要很长时间

如何解决在 Neo4j 中创建数据库需要很长时间

更新的问题:

我是 Neo4j 的新手,我正在尝试创建一个电影评级数据库我有一个包含 100.000 个寄存器 (2,3 MB) 的文件,表示用户何时对电影进行评分;文件看起来像这样(这个数据集来自 MovieLens):

dataset file

我正在使用 py2neo,并使用以下代码创建了数据库

data = pd.read_csv('ratings_small.csv')
def create_bipartite_graph(data):
#Indexes creation to perform the queries
    graph.run('''
        CREATE INDEX user_index IF NOT EXISTS FOR (u:User) ON (u.UserId)
    ''')
    graph.run('''
        CREATE INDEX movie_index IF NOT EXISTS FOR (m:Movie) ON (m.MovieId)
    ''')
    actual_user_node = None
    for index,row in data.iterrows():
        userID = int(row['userId'])
        movieID = int(row['movieId'])
        rating = row['rating']
        date = datetime.fromtimestamp(row['timestamp']).strftime("%m/%d/%Y,%H:%M:%s")

        #Creation nodes and relationships
        graph.run('''
            MERGE(u:User{UserId: $uID})
            MERGE(m:Movie{MovieId: $mID})
            CREATE (u)-[:RATED_MOVIE{rating: $r,date: $d}]->(m)
        ''',parameters = {'uID': userID,'mID': movieID,'r': rating,'d': date})

问题在于那个小数据集,创建图表需要 2 个多小时。大大减少数据库创建时间有什么建议吗?

使用 LOAD CSV

这是我在neo4j浏览器中执行的查询

EXPLAIN LOAD CSV With HEADERS FROM 'file:///ratings_small.csv' AS line FIELDTERMINATOR ',' 
MERGE(m:Movie{MovieId: toInteger(line.movieId)})
MERGE(u:User{UserId: toInteger(line.userId)})
CREATE (u)-[:RATED_MOVIE{rating:toFloat(line.rating)}]->(m)

这是个人资料计划: profile plan

解决方法

每个 graph run 调用不仅代表到服务器的完整往返,而且是一个完全独立的事务。像这样工作,在循环的每个循环中都调用一个这样的调用,因此效率非常低。

我建议您查看批量数据操作 API: https://py2neo.readthedocs.io/en/stable/bulk/index.html

,

您是从 CSV 文件开始的,对吗?您可以使用 LOAD CSV 将其带入 Neo4j。使用您的 python 代码将 csv 放在 Neo4j 导入目录中。然后运行这个查询...

LOAD CSV With HEADERS FROM 'file:///ratings_small.csv' AS line FIELDTERMINATOR ',' MERGE(m:Movie{MovieId: toInteger(line.mID)})
    ''',parameters = {'mID': toInteger(line.movieID),rating:toFloat(line.rating)})

如果你想一次迭代 5000 行,你可以在开始时添加这个

Using periodic commit 5000 ....

这应该运行得更快!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。