Создание ребер в neo4j на основе результатов запроса - PullRequest
0 голосов
/ 27 мая 2018

Я моделирую граф перехода поискового термина в программном обеспечении электронной коммерции как граф узлов (терминов) и ребер (переходов).Если пользователь вводит, например, iphone в строке поиска, а затем уточняет запрос до iphone 6s, это будет смоделировано как два узла и ребро между этими узлами.Один и тот же переход членов разных пользователей приведет к нескольким ребрам между узлами.

enter image description here

Теперь я хотел бы создать ребро с суммарным весом 4, чтобы показать, что 4 пользователя сделали этот конкретный переход.Как объединить результаты запроса count(*) с запросом на создание, чтобы получить ребро со свойством weight = 4

Мой count(*) запрос:

MATCH (n:Term)-[r]->(n1:Term)
RETURN type(r), count(*)

I 'Можно ожидать, что комбинированный запрос будет выглядеть следующим образом, но такого рода sql-подобная композиция, по-видимому, невозможна в cypher:

MATCH (n:Term), (n1:Term)
WHERE (n)-[tr:TRANSITION]->(n1)
CREATE (n)-[actr:ACC_TRANSITION {count: 
    MATCH (n:Term)-[r]->(n1:Term) RETURN 
    count(*)}
]->(n1)
RETURN n, n1

Неуниверсальный запрос для создания накопленного перехода, который работает:1022 *

MATCH (n:Term), (n1:Term)
WHERE n.term = 'iphone' AND n1.term ='iphone 6s'
CREATE (n)-[actr:ACC_TRANSITION {count: 4}]->(n1)
RETURN n, n1

Любые другие идеи о том, как подходить и моделировать эту проблему?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Если вы сначала сопоставите узлы и отношения, а затем используете set, вы не будете создавать дубликаты узлов или отношений

Match (n:Term)-[r]->(n1.Term)
with n as nn,count(r) as rel_count,n1 as nn1
set r.ACC_TRANSITION=rel_count
return nn,nn1,r

Функция создания создаст дубликаты.

0 голосов
/ 27 мая 2018

Используйте С, как это:

MATCH (n:Term)-[r]->(n1:Term)
WITH n as n, count(*) as rel_count, n1
CREATE (n)-[:ACC_TRANSITION {count:rel_count}]->(n1)
RETURN n, n1
...