如何将关系数据设置为节点上的属性?
How do I set relationship data as properties on a node?
我已经从 SQL 飞跃到 Neo4j。作为构建推荐引擎的第一步,我需要将一些复杂的关系设置为节点的属性。
此 Cypher 查询 returns 类别和权重列表。
MATCH (m:Movie {name: "The Matrix"})<-[:TAKEN_FROM]-(i:Image)-[r:CLASSIFIED_AS]->(c:Category) RETURN c.name, avg(r.weight)
这个returns
{ "fighting": 0.334, "looking moody": 0.250, "lying down": 0.237 }
如何在父节点上将这些结果设置为键值对?
期望的结果是这样的:
(m:Movie { "name": "The Matrix", "fighting": 0.334, "looking moody": 0.250, "lying down": 0.237 })
此外,我假设我应该分批处理我的 (m:Movie) 节点,那么完成此操作的最佳方法是什么?
不太确定您是如何获得该输出的,return 不应该 return 将它们都作为键值对。相反,我希望是这样的:{"c.name":"fighting", "avg(r.weight)":0.334}
,每对都有单独的记录。
为此您可能需要 APOC procedures,因为您需要一种方法将 属性 键设置为类别名称的值。这有点棘手,但您可以通过从收集的对创建一个映射来完成此操作,然后使用 SET 和 += 更新相关属性:
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
就批处理而言,看一下 apoc.periodic.iterate()
,它将允许您迭代外部查询的流式结果并在流的批次上执行内部查询:
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
我已经从 SQL 飞跃到 Neo4j。作为构建推荐引擎的第一步,我需要将一些复杂的关系设置为节点的属性。
此 Cypher 查询 returns 类别和权重列表。
MATCH (m:Movie {name: "The Matrix"})<-[:TAKEN_FROM]-(i:Image)-[r:CLASSIFIED_AS]->(c:Category) RETURN c.name, avg(r.weight)
这个returns
{ "fighting": 0.334, "looking moody": 0.250, "lying down": 0.237 }
如何在父节点上将这些结果设置为键值对?
期望的结果是这样的:
(m:Movie { "name": "The Matrix", "fighting": 0.334, "looking moody": 0.250, "lying down": 0.237 })
此外,我假设我应该分批处理我的 (m:Movie) 节点,那么完成此操作的最佳方法是什么?
不太确定您是如何获得该输出的,return 不应该 return 将它们都作为键值对。相反,我希望是这样的:{"c.name":"fighting", "avg(r.weight)":0.334}
,每对都有单独的记录。
为此您可能需要 APOC procedures,因为您需要一种方法将 属性 键设置为类别名称的值。这有点棘手,但您可以通过从收集的对创建一个映射来完成此操作,然后使用 SET 和 += 更新相关属性:
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
就批处理而言,看一下 apoc.periodic.iterate()
,它将允许您迭代外部查询的流式结果并在流的批次上执行内部查询:
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