Neo4j: Сколько времени занимает КАЖДАЯ ветвь между узлами A и F? - PullRequest
0 голосов
/ 15 сентября 2018

Дан следующий график:

    -> B --> E -
   /            \ 
A -              -> F
   \            /
    -> C --> D -

Все узлы имеют тип задачи.Как свойства, они имеют время начала и время окончания (оба типа данных DateTime).Все отношения являются CONNECT_TO и направлены вправо.У отношений нет свойств.

Может ли кто-нибудь помочь мне, как должен выглядеть следующий запрос в Cypher: Как много времени занимает КАЖДАЯ ветвь между узлом A и F?

Список как результат будетбудь в порядке:

Path           Duration [minutes]
---------------------------------
A->B->E->F     100
A->C->D->F      50

Спасибо за помощь.

1 Ответ

0 голосов
/ 16 сентября 2018

Создание вашего графика

Первый оператор создает узлы, второй - отношения между ними.

CREATE
  (TaskA:Task {name: 'TaskA', time:10}),
  (TaskB:Task {name: 'TaskB', time:20}),
  (TaskC:Task {name: 'TaskC', time:30}),
  (TaskD:Task {name: 'TaskD', time:10}),
  (TaskE:Task {name: 'TaskE', time:40}),
  (TaskF:Task {name: 'TaskF', time:10})

CREATE
  (TaskA)-[:CONNECT_TO]->(TaskB),
  (TaskB)-[:CONNECT_TO]->(TaskE),
  (TaskE)-[:CONNECT_TO]->(TaskF),
  (TaskA)-[:CONNECT_TO]->(TaskC),
  (TaskC)-[:CONNECT_TO]->(TaskD),
  (TaskD)-[:CONNECT_TO]->(TaskF);

Ваше желаемое решение

  1. Определение вашего началаузел (Задача A)
  2. Поиск пути переменной длины
  3. Определение конечного узла (Задача F)
  4. Получение всех узлов задачи для каждого пути
  5. Суммапродолжительность для всех задач каждого пути
  6. Бонус: количество задач на путь

Neo4j Оператор:

//           |----------- 1 -----------|  |----- 2 ----|  |----------- 3 -----------|
MATCH path = (taskA:Task {name: 'TaskA'})-[:CONNECT_TO*]->(taskF:Task {name: 'TaskF'})
UNWIND
// |-- 4 -|
nodes(path) AS task
//           |---- 5 -----|                  |--- 6 ----|
RETURN path, sum(task.time) AS timeConsumed, length(path)+1 AS taskAmount;

Результат

╒══════════════════════════════════════════════════════════════════════╤════════════════╤════════════╕
│"path"                                                                │ "timeConsumed" │"taskAmount"│
╞══════════════════════════════════════════════════════════════════════╪════════════════╪════════════╡
│[{"name":"TaskA","time":10},{},{"name":"TaskB","time":20},{"name":"Tas│80              │4           │
│kB","time":20},{},{"name":"TaskE","time":40},{"name":"TaskE","time":40│                │            │
│},{},{"name":"TaskF","time":10}]                                      │                │            │
├──────────────────────────────────────────────────────────────────────┼────────────────┼────────────┤
│[{"name":"TaskA","time":10},{},{"name":"TaskC","time":30},{"name":"Tas│60              │4           │
│kC","time":30},{},{"name":"TaskD","time":10},{"name":"TaskD","time":10│                │            │
│},{},{"name":"TaskF","time":10}]                                      │                │            │
└──────────────────────────────────────────────────────────────────────┴────────────────┴────────────┘
...