neo4j官网指出,我们不能向关系类型传递参数。 但是,我在批量添加嵌入时需要向关系传递参数。
Neo4j通过
driver.execute_query('''
UNWIND $movies as movie
MATCH (m:Movie {title: movie.title, plot: movie.plot})
CALL db.create.setNodeVectorProperty(m, 'embedding', movie.embedding)
''', movies=nodes_with_embeddings, database_=DB_NAME)
此代码使用
$movies
传递参数并传递
movie.title
作为属性值。每个
movie
都是一个字典。
但是,我无法使用
$datas
like
MATCH (h:Entity {id: data.id})-[r: data.r]->(t:Entity {id: data.id})
传递关系类型,我尝试过使用字符串的公共串联来传递参数,并一一添加嵌入属性。
例如
"MATCH (h:Entity {id: data.h_id})-[r:"+data['r']+"]->(t:Entity {id: data.t_id})
但是我想使用批量操作来加快速度。
有没有办法将参数传递给批量操作的关系? 谢谢你的时间。
你说的对,Neo4j 的 Cypher 语法目前不支持直接将参数传递给关系类型。不过,你想要实现批量操作,可以使用 APOC 库提供的
apoc.periodic.iterate
函数来达到类似的效果。
以下是如何使用
apoc.periodic.iterate
和参数进行批量操作,并为关系添加嵌入属性的示例:
driver.execute_query(
'''
CALL apoc.periodic.iterate(
"UNWIND $datas AS data RETURN data",
"
MATCH (h:Entity {id: data.h_id})
MATCH (t:Entity {id: data.t_id})
CALL apoc.create.relationship(h, data.r, {embedding: data.embedding}, t) YIELD rel
RETURN count(*)
",
{batchSize:10000, parallel:false, params:{datas: $datas}}
)
''',
datas=your_data
)
代码解释:
-
apoc.periodic.iterate
: 这个 APOC 函数允许你迭代执行 Cypher 语句。它接受三个参数:-
第一个参数是一个 Cypher 语句,用于生成要迭代的数据。这里我们使用
UNWIND
展开传入的参数datas
。 -
第二个参数是另一个 Cypher 语句,它将针对迭代生成的每一行数据执行。在这里,我们匹配节点,使用
apoc.create.relationship
创建关系,并设置嵌入属性。 -
第三个参数是一个 map,包含迭代的配置选项和参数。
-
batchSize
: 每次迭代处理的数据量。 -
parallel
: 是否并行执行迭代。 -
params
: 传递给迭代的 Cypher 语句的参数。
-
-
第一个参数是一个 Cypher 语句,用于生成要迭代的数据。这里我们使用
-
datas
: 这是一个 Python 列表,包含字典,每个字典代表一个关系和其嵌入信息:
your_data = [
{"h_id": "entity1", "t_id": "entity2", "r": "RELATED_TO", "embedding": [0.1, 0.2, 0.3]},
{"h_id": "entity3", "t_id": "entity1", "r": "KNOWS", "embedding": [0.4, 0.5, 0.6]},
# ... 更多关系数据
]
优势:
-
批量操作:
apoc.periodic.iterate
允许你高效地处理大量数据,因为它会将数据分成多个批次进行处理。 - 灵活性: 你可以根据需要自定义关系类型和嵌入属性。
注意事项:
- 确保你的 Neo4j 数据库安装了 APOC 库。
-
根据你的数据量和硬件配置调整
batchSize
参数以获得最佳性能。
希望这个方法可以帮助你解决问题!
标签:python,neo4j,cypher,neo4j-apoc From: 78796966