2017-02-23 2 views
2

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

match (origin:type1 {t1id:"start"}), 
    (dest:type2 {t2id:"end"}), 
    path= (origin)<-[:JOINS]-()-[:JOINS*..10]-()<-[:PARKING]-(dest) 
    with extract(n in NODES(path) | n._length) as x 
    return x 

Есть три типа узлов и путь следующим образом:

(type1)-[:JOINS]-(type2)-[:JOINS]-(type1)-[:JOINS]-(type2)-...<-[:PARK]-(type3) 

Запрос выше дает список путей (ниже), но я не могу найти способ суммировать значения вдоль путь, чтобы дать общую длину каждого отдельного пути. Нулевые значения относятся к узлам типа 2, которые не имеют значения длины.

x 
[8.06, null, 34.25, null, 46.52, null, 37.38, null, 44.2, null] 
[8.06, null, 34.25, null, 32.41, null, 31.3, null, 19, null, 44.2, null] 
[8.06, null, 34.25, null, 14.63, null, 44.2, null] 
[8.06, null, 32.41, null, 46.52, null, 37.38, null, 44.2, null] 
[8.06, null, 32.41, null, 34.25, null, 31.3, null, 19, null, 44.2, null] 
[8.06, null, 32.41, null, 14.63, null, 44.2, null] 
[8.06, null, 31.3, null, 35.86, null, 57.93, null, 55.35, null, 44.2, null] 
[8.06, null, 31.3, null, 19, null, 44.2, null] 

Когда я использую раскручивать это только предоставляет список всех длин и не отделены друг от пути (ниже)

y 
8.06 
null 
34.25 
null 
46.52 
null 
37.38 
null 
44.2 
null 
8.06 
null 
34.25 
null 
...etc 

Любая помощь или советы будут очень высокую оценку.

ответ

1

reduce Вам нужно и case и path агрегации:

match (origin:type1 {t1id:"start"}), 
     (dest:type2 {t2id:"end"}) 
with origin, dest 
match path= (origin)<-[:JOINS]-()-[:JOINS*..10]-()<-[:PARKING]-(dest) 
return path, 
     reduce(acc=0, n in nodes(path) | 
       acc + case when n._length is null then 0 else n._length end 
     ) as pathLength 
+0

ах отлично спасибо, работает отлично! – SAB

Смежные вопросы