Cypher-Как установить свойство для узлов по кратчайшему пути

Я новичок в neo4j и cypher, с опытом работы около недели ... Я работаю над небольшим проектом по манипулированию графиком десятков тысяч пакетных заданий TWS, выполняемых на мэйнфрейме моей компании. Ключевая миссия - выяснить, что мы назвали ключевым путем пакетных заданий последнего пакета в полночь, который на самом деле является взвешенным кратчайшим путем в neo4j. Я уже достиг этой цели, используя шифр, как показано ниже.

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) 
call apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
RETURN path,weight`

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

Но мне пришла в голову новая идея: что, если я могу улучшить этот шифр, чтобы узлам на возвращаемом пути была присвоена метка / или свойство?, чтобы позже я мог легко ссылаться на key-path снова, не вызывая каждый раз Дейкстру. Я знаю, что могу использовать свою программу python для этого сразу после возврата ключевого пути и сгенерировать серию cypher для выполнения этой работы, но я думаю, что должно быть решение только с cypher. Заранее большое спасибо!


person AlexDxl    schedule 09.03.2017    source источник


Ответы (1)


  1. Вычислить значение идентификатора пути
  2. Вам нужно взять массив узлов по пути - УЗЛЫ
  3. Пройдите через каждый узел - UNWIND или FOREACH
  4. Набор, метка или свойство - теперь вы не можете использовать значение переменной в качестве метки, это означает запись в свойство - SET

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b,
     a.Jobname + '-' + b.Jobname AS pathID
CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
FOREACH (n IN NODES(path)|
  SET n.pathID = pathID,
      n.pathWeight = weight
)
RETURN path,weight

Поскольку вы используете apoc, вы можете устанавливать ярлыки:

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b,
     'inCalculatedPath' + '-' + a.Jobname + '-' + b.Jobname AS pathID
CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
CALL apoc.create.addLabels( NODES(path), ['inCalculatedPath', pathID])
RETURN path,weight

Еще один способ - добавить что-то вроде узла Calculated path:

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b
CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
CREATE (P:CalculatedPath) 
  SET P.weight = weight,
      P.start = ID(a),
      P.end = ID(b),
      P.pathNodes = REDUCE(ids=[], n IN NODES(path)| ids + ID(n)),
      P.pathRels  = REDUCE(ids=[], r IN RELS(path) | ids + ID(r))
FOREACH (n IN NODES(path)|
  MERGE (n)-[:inPath]->(P)
)
RETURN path, weight

И вернем пути:

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b
MATCH (path:CalculatedPath {start: ID(A), end: ID(b)})
RETURN path, path.weight AS weight
person stdob--    schedule 09.03.2017
comment
Большое спасибо! Я перепробовал все шифры, и они просто отлично работают !! Этот замечательный пример действительно помог мне лучше понять силу cypher и neo4j ... Еще раз спасибо! - person AlexDxl; 09.03.2017