Как получить путь с отношениями из вызова randomWalk в Cypher?

Я использую алгоритм Neo4j randomWalk на основе двух типов узлов (N1 и N2) и одного типа отношений (R1). Алгоритм случайного блуждания возвращает список NodeId. Проблема здесь в том, что я хотел бы получить отношения R1 между узлами каждого пути.

Я пробовал следующий запрос:

    MATCH (n:N1) WHERE ID(n) = 38
    CALL algo.randomWalk.stream(ID(n), 4, 4)
    YIELD nodeIds
    UNWIND nodeIds as nodeId
    OPTIONAL MATCH (l:N1)-[r:R1]-(q:N2)
    WHERE (ID(l) = nodeId) AND (ID(q) in nodeIds)
    RETURN l,q, nodeIds, nodeId,ID(q), ID(l)

Однако это не очень хорошее решение, потому что оно показывает все отношения между узлами l и узлами q, которые присутствуют в идентификаторах узлов. Поэтому я не понимаю путь. Вы знаете, как я могу решить эту проблему?

Спасибо за уделенное время, Синдорик


person Syndo rik    schedule 15.05.2019    source источник
comment
Вы говорите, что хотите r, но затем не возвращаете его в своем примере. Кроме того, почему бы вам просто не указать путь? (neo4j.com/docs/graph-algorithms/current/algorithms/ случайное блуждание)   -  person Tezra    schedule 17.05.2019
comment
Ну, в этом примере я не возвращал r, потому что я просто хотел проверить, являются ли идентификаторы, которые я получаю, идентификаторами пути. Более того, я не даю переменную пути, потому что созданная переменная является виртуальной, без свойства отношения. Чуть ниже я дал ответ на свою проблему, вы можете проверить его, чтобы убедиться, что он хорош.   -  person Syndo rik    schedule 18.05.2019


Ответы (1)


После некоторых исследований я нашел способ получить n-й элемент и n-й+1 элемент в одном и том же цикле UNWIND.

Вот что я сделал:

MATCH (n:Clips) WHERE ID(n) = 39
CALL algo.randomWalk.stream(ID(n),4,1)
YIELD nodeIds
UNWIND RANGE(0,size(nodeIds)-1) as idx
MATCH (l)-[r:R1]-(q)
WHERE ID(l) = nodeIds[idx] and ID(q) = nodeIds[idx+1]
RETURN ID(l), ID(q),nodeIds

При этом я успешно получил путь с отношениями и узлами. Не стесняйтесь, если у вас есть вопросы о том, как это работает. Изображение ниже - это то, что я получаю.

Результат, который я получаю

person Syndo rik    schedule 15.05.2019
comment
Если вместо этого вы укажете путь, то не можете ли вы просто UNWIND RELATIONSHIPS(path) as rs RETURN startNode(rs) as l endNode(rs) AS q получить пары? - person Tezra; 20.05.2019
comment
Что ж, когда я это делаю, Отношения (путь) возвращают пустой список, поскольку randomWalk фактически создает только виртуальный путь. - person Syndo rik; 21.05.2019