Как можно размотать коллекцию, выполнить операцию и повторно собрать коллекцию для каждой записи в потоке? - PullRequest
0 голосов
/ 18 января 2019

Я использую алгоритм случайного блуждания, чтобы создать временную цепочку событий. Каждая запись в результирующей коллекции является идентификатором узла. Пример:

[43116, 43116, 43116, 43116, 43116, 43116]
[61412, 61416, 4948, 61417, 61419, 61420]
...

Для каждой строки, возвращаемой из потока, как я могу развернуть значения, выполнить algo.getNodeById (node_id) для этого элемента и упаковать эти результаты обратно в коллекцию?

Запрос Cypher выглядит следующим образом:

CALL algo.randomWalk.stream(null, 5, 20, {
  nodeQuery: "MATCH (a:Asset) RETURN id(a) as id",
  relationshipQuery: "MATCH (a1:Asset)<-[:PATIENT]-(e1:EVENT)-[:NEXT]->(e2:EVENT)-[:PATIENT]-(a2:Asset) RETURN id(a1) as source, id(a2) as target",
  graph: "cypher" })
YIELD nodeIds

Ответы [ 2 ]

0 голосов
/ 19 января 2019

(Этот мой второй ответ основан на пояснениях в комментариях к моему первому ответу.)

Вместо этого вы можете сделать это (используя algo.getNodesById(), который принимает список идентификаторов узлов):

CALL algo.randomWalk.stream(null, 5, 20, {
  nodeQuery: "MATCH (a:Asset) RETURN id(a) as id",
  relationshipQuery: "MATCH (a1:Asset)<-[:PATIENT]-(e1:EVENT)-[:NEXT]->(e2:EVENT)-[:PATIENT]-(a2:Asset) RETURN id(a1) as source, id(a2) as target",
  graph: "cypher" })
YIELD nodeIds
UNWIND nodeIds AS nodeId
WITH DISTINCT nodeId
RETURN algo.getNodesById(COLLECT(nodeId)) AS nodes;

Или вы можете сделать то же самое без algo.getNodesById():

CALL algo.randomWalk.stream(null, 5, 20, {
  nodeQuery: "MATCH (a:Asset) RETURN id(a) as id",
  relationshipQuery: "MATCH (a1:Asset)<-[:PATIENT]-(e1:EVENT)-[:NEXT]->(e2:EVENT)-[:PATIENT]-(a2:Asset) RETURN id(a1) as source, id(a2) as target",
  graph: "cypher" })
YIELD nodeIds
UNWIND nodeIds AS nodeId
WITH DISTINCT nodeId
MATCH (n) WHERE ID(n) = nodeId
RETURN COLLECT(n) AS nodes;

В обоих запросах предложение WITH DISTINCT nodeId необходимо для удаления дубликатов.

0 голосов
/ 18 января 2019

Cypher не удаляет коллекцию после выполнения UNWIND над ней. Таким образом, нет необходимости воссоздавать коллекцию.

Например:

WITH [61412, 61416, 4948, 61417, 61419, 61420] AS data
UNWIND data AS d
RETURN data, d;

возвращает это:

╒════════════════════════════════════╤═════╕
│"data"                              │"d"  │
╞════════════════════════════════════╪═════╡
│[61412,61416,4948,61417,61419,61420]│61412│
├────────────────────────────────────┼─────┤
│[61412,61416,4948,61417,61419,61420]│61416│
├────────────────────────────────────┼─────┤
│[61412,61416,4948,61417,61419,61420]│4948 │
├────────────────────────────────────┼─────┤
│[61412,61416,4948,61417,61419,61420]│61417│
├────────────────────────────────────┼─────┤
│[61412,61416,4948,61417,61419,61420]│61419│
├────────────────────────────────────┼─────┤
│[61412,61416,4948,61417,61419,61420]│61420│
└────────────────────────────────────┴─────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...