python - Neo4j 使用 py2neo 从 pandas dataframe 创建节点和关系

标签 python pandas neo4j cypher py2neo

使用 py2neo 从 Neo4j 数据库的密码查询中获取 pandas 数据框的结果非常简单,因为:

>>> from pandas import DataFrame
>>> DataFrame(graph.data("MATCH (a:Person) RETURN a.name, a.born LIMIT 4"))
   a.born              a.name
0    1964        Keanu Reeves
1    1967    Carrie-Anne Moss
2    1961  Laurence Fishburne
3    1960        Hugo Weaving

现在我正在尝试使用 py2neo 创建(或更好地合并)一组节点和关系,从 pandas 数据框到 Neo4j 数据库。想象一下我有一个像这样的数据框:

LABEL1 LABEL2
p1 n1
p2 n1
p3 n2
p4 n2

其中标签是列标题,属性是值。我想为我的数据帧的每一行重现以下密码查询(以第一行为例):

query="""
    MATCH (a:Label1 {property:p1))
    MERGE (a)-[r:R_TYPE]->(b:Label2 {property:n1))
"""

我知道我可以告诉 py2neo 只是 graph.run(query),或者甚至以相同的方式运行 LOAD CSV cypher 脚本,但我想知道我是否可以遍历数据框并在 py2neo 中逐行应用上述查询。

最佳答案

您可以使用 DataFrame.iterrows() 遍历 DataFrame 并对每一行执行查询,将行中的值作为参数传递。

for index, row in df.iterrows():
    graph.run('''
      MATCH (a:Label1 {property:$label1})
      MERGE (a)-[r:R_TYPE]->(b:Label2 {property:$label2})
    ''', parameters = {'label1': row['label1'], 'label2': row['label2']})

这将每行执行一个事务。我们可以将多个查询批处理到一个事务中以获得更好的性能。

tx = graph.begin()
for index, row in df.iterrows():
    tx.evaluate('''
      MATCH (a:Label1 {property:$label1})
      MERGE (a)-[r:R_TYPE]->(b:Label2 {property:$label2})
    ''', parameters = {'label1': row['label1'], 'label2': row['label2']})
tx.commit()

通常我们可以在单个事务中批处理 ~20k 数据库操作。

关于python - Neo4j 使用 py2neo 从 pandas dataframe 创建节点和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738180/

相关文章:

c++ - Visual Studio 2012 Boost.Python 集成

python - Py2Neo 没有正确创建日期时间数据类型?

Neo4j Cypher,仅返回指定关系

Python - iterrows 的替代解决方案

python - 比较包含 nan 的 pandas 系列是否相等?

javascript - neo4j 中表格的可视化 (spoon-neo4j)

python - 使用 python 解析 CSV 文件(稍后制作决策树)

python - 错误 : No matching distribution found for pip

python - 如何用lxml解析html页面,<br/>搞砸了?

python - Pandas 特殊枢轴数据框