2016-02-25 4 views
1

Я хочу получить запрос, который начинается с 2 заданных узлов и для каждого из них берет до 5 связанных узлов (по соотношению R1), а затем ищет кратчайшую часть между этими 10 узлами (5 от 1-го и 5-го от 2-го исходные узлы).Как я могу разбить свой запрос Cypher на 2 подзапроса?

Я не могу «разбить» мой запрос на 2 части, каждый из которых вычисляет 5 узлов, а затем MATCH путь на обоих из них.

Мой запрос до сих пор:

MATCH (n1:MyNode {node_id:12345})-[:R1]-(r1:RelatedNode) 
WITH r1 LIMIT 5 
MATCH (n2:MyNode {node_id:98765})-[:R1]-(r2:RelatedNode) 
WITH r1,r2 LIMIT 5 
MATCH p=shortestPath((r1)-[*1..10]-(r2)) 
RETURN p 

Проблема заключается в том, что второй подзапрос действительно не отделен от первого, и до сих пор несет на r1, что делает LIMIT неправильно.

Я хочу запустить первую часть, а затем запустить вторую часть (с только r2), и только потом после того, как r1 и r2 вычисленными по отдельности, соответствую самому короткому пути. Это можно сделать?

Спасибо!

+0

Можете ли вы, пелас, написать два запроса, которые вы хотите в псевдокоде? просто чтобы узнать, чего вы ожидаете в результате каждого из ваших запросов. – Supamiu

ответ

1

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

Я думаю, вы должны пройти через ограниченный результат в виде коллекции и UNWIND его позже:

MATCH (n1:MyNode {node_id:12345})-[:R1]-(r1:RelatedNode) 
WITH r1 LIMIT 5 
WITH collect(r1) as startNodes 
MATCH (n2:MyNode {node_id:98765})-[:R1]-(r2:RelatedNode) 
WITH r2, startNodes LIMIT 5 
WITH collect(r2) as endNodes, startNodes 
UNWIND startNodes as s UNWIND endNodes as e 
MATCH p=shortestPath((s)-[*1..10]-(e)) 
RETURN p, length(p) ORDER BY length(p) ASC LIMIT 1 

Имейте в виду, что два UNWIND основном создать перекрестную продукт. Итак, вы рассчитали 5 * 5 = 25 кратчайших путей. Из них мы сортируем по длине и выбираем первый.

+0

Спасибо! UNWIND сделал трюк. Я не знал об этом. Перекрестный продукт - это то, что я хотел. –

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