Как установить данные отношений в качестве свойств на узле?

avatar
David Apple
7 апреля 2018 в 22:21
30
1
0

Я перешел с SQL на Neo4j. У меня есть несколько сложных взаимосвязей, которые мне нужно задать как свойства узлов в качестве первого шага к созданию системы рекомендаций.

Этот запрос Cypher возвращает список категорий и весов.

MATCH (m:Movie {name: "The Matrix"})<-[:TAKEN_FROM]-(i:Image)-[r:CLASSIFIED_AS]->(c:Category) RETURN c.name, avg(r.weight)

Это возвращает

{ "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) партиями, так как же лучше всего это сделать?

Источник

Ответы (1)

avatar
InverseFalcon
7 апреля 2018 в 22:43
1

Не совсем уверен, как вы получаете этот вывод, этот возврат не должен возвращать их оба как пары ключ-значение. Вместо этого я бы ожидал что-то вроде: {"c.name":"fighting", "avg(r.weight)":0.334} с отдельными записями для каждой пары.

Для этого вам могут понадобиться процедуры APOC, так как вам нужно средство для установки ключа свойства в значение имени категории. Это немного сложно, но вы можете сделать это, создав карту из собранных пар, а затем использовать 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