Neo4j 如何将关系数据设置为节点上的属性?
我已经实现了从SQL到Neo4j的飞跃。作为构建推荐引擎的第一步,我需要将一些复杂的关系设置为节点上的属性 此Cypher查询返回类别和权重的列表Neo4j 如何将关系数据设置为节点上的属性?,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我已经实现了从SQL到Neo4j的飞跃。作为构建推荐引擎的第一步,我需要将一些复杂的关系设置为节点上的属性 此Cypher查询返回类别和权重的列表 MATCH(m:Movie{name:“矩阵”})(c:Category)返回c.name,avg(r.weight) 这是回报 {“战斗”:0.334,“情绪低落”:0.250,“躺下”:0.237} 如何在父节点上将这些结果设置为键值对? 预期的结果是: (m:Movie{“name”:“矩阵”,“战斗”:0.334,“看起来情绪化”:0.250
MATCH(m:Movie{name:“矩阵”})(c:Category)返回c.name,avg(r.weight)
这是回报
{“战斗”:0.334,“情绪低落”:0.250,“躺下”:0.237}
如何在父节点上将这些结果设置为键值对?
预期的结果是:
(m:Movie{“name”:“矩阵”,“战斗”:0.334,“看起来情绪化”:0.250,“躺下”:0.237})
另外,我假设我应该分批处理我的(m:Movie)节点,那么实现这一点的最佳方法是什么?不太确定您是如何获得输出的,该返回不应该将它们作为键值对返回。相反,我希望像这样的东西:
{“c.name”:“fighting”,“avg(r.weight)”:0.334}
,每对都有单独的记录
您可能需要这样做,因为您需要将属性键设置为类别名称的值的方法。这有点棘手,但您可以通过从收集的对创建一个映射来完成,然后使用SET with+=更新相关属性:
MATCH (m:Movie {name: "The Matrix"})<-[:TAKEN_FROM]-(:Image)-[r:CLASSIFIED_AS]->(c:Category)
WITH m, c.name as name, avg(r.weight) as weight
WITH m, collect([name, weight]) as category
WITH m, apoc.map.fromPairs(category) as categories
SET m += categories
CALL apoc.periodic.iterate(
"MATCH (m:Movie)
RETURN m",
"MATCH (m)<-[:TAKEN_FROM]-(:Image)-[r:CLASSIFIED_AS]->(c:Category)
WITH m, c.name as name, avg(r.weight) as weight
WITH m, collect([name, weight]) as category
WITH m, apoc.map.fromPairs(category) as categories
SET m += categories",
{iterateList:true, parallel:false}) YIELD total, batches, errorMessages
RETURN total, batches, errorMessages