py2neo 中的密码查询以使用 n 个 ID 和参数列表更新 n 个节点
cypher query in py2neo to update n Nodes with a list of n ids and parameters
假设我想使用存储在 pd.Dataframe
中的数据更新大量现有节点。因为我知道如何编写将处理单个节点更新的参数化查询,所以我的基本解决方案是将此查询设置为循环,并为数据框中的每一行 运行 它。
for _,row in df.iterrows():
query='''MATCH (p:Person)
WHERE p.name={name} AND p.surname = {surname}
SET p.description={description} '''
tx.run(query,name=row['name'],surname=row['surname'],
description=row['description'])
但是,必须有一种更直接(和更快)的方式将此信息传递给查询,以便在服务器端进行迭代 "managed"。真的吗?我还没有找到相关的任何文档。
您可以通过运行密码 LOAD 查询并提供包含您的数据的 csv 文件来做到这一点:
LOAD CSV WITH HEADERS FROM 'file:///file.csv' as csvLine fieldterminator ';'
MATCH (p:Person {name:csvLine.name, p.surname:csvLine.surname})
SET p.description=csvLine.description
但我认为没有将数据数组传递到匹配循环的解决方案。
不是像这样循环,每个条目执行一个 Cypher 查询,您应该将所有这些收集到地图对象的列表参数中并进行单个 Cypher 查询(如果您有 > 100k 左右,您可以批处理它要处理的条目)。 Michael Hunger 有 good blog entry on this approach.
您可以在列表参数上使用 UNWIND 将其转换为行,并一次处理所有内容。假设您将列表作为 data
:
UNWIND $data as row
MATCH (p:Person)
WHERE p.name = row.name AND p.surname = row.surname
SET p.description = row.description
基本问题已在 InverseFalcon 的答案中解决,但为了提供包括 py2neo
和 pandas bits
的完整答案,我 post 下面的代码:
query='''UNWIND {batch} AS row
MATCH (p:Person)
WHERE p.name=row.name AND p.surname = row.surname
SET p.description=row.description '''
graph.run(query,batch=df.to_dict(orient='records'))
所以,最后这更像是一个 neo4j
而不是 py2neo
问题,neo4j 文档中的相关信息是 here
假设我想使用存储在 pd.Dataframe
中的数据更新大量现有节点。因为我知道如何编写将处理单个节点更新的参数化查询,所以我的基本解决方案是将此查询设置为循环,并为数据框中的每一行 运行 它。
for _,row in df.iterrows():
query='''MATCH (p:Person)
WHERE p.name={name} AND p.surname = {surname}
SET p.description={description} '''
tx.run(query,name=row['name'],surname=row['surname'],
description=row['description'])
但是,必须有一种更直接(和更快)的方式将此信息传递给查询,以便在服务器端进行迭代 "managed"。真的吗?我还没有找到相关的任何文档。
您可以通过运行密码 LOAD 查询并提供包含您的数据的 csv 文件来做到这一点:
LOAD CSV WITH HEADERS FROM 'file:///file.csv' as csvLine fieldterminator ';'
MATCH (p:Person {name:csvLine.name, p.surname:csvLine.surname})
SET p.description=csvLine.description
但我认为没有将数据数组传递到匹配循环的解决方案。
不是像这样循环,每个条目执行一个 Cypher 查询,您应该将所有这些收集到地图对象的列表参数中并进行单个 Cypher 查询(如果您有 > 100k 左右,您可以批处理它要处理的条目)。 Michael Hunger 有 good blog entry on this approach.
您可以在列表参数上使用 UNWIND 将其转换为行,并一次处理所有内容。假设您将列表作为 data
:
UNWIND $data as row
MATCH (p:Person)
WHERE p.name = row.name AND p.surname = row.surname
SET p.description = row.description
基本问题已在 InverseFalcon 的答案中解决,但为了提供包括 py2neo
和 pandas bits
的完整答案,我 post 下面的代码:
query='''UNWIND {batch} AS row
MATCH (p:Person)
WHERE p.name=row.name AND p.surname = row.surname
SET p.description=row.description '''
graph.run(query,batch=df.to_dict(orient='records'))
所以,最后这更像是一个 neo4j
而不是 py2neo
问题,neo4j 文档中的相关信息是 here