2014-09-16 4 views
0

Я новичок в neo4j и пытаюсь отобразить самый длинный путь к известному узлу. В этом примере есть только один прямой путь. (Например, node1 => node2 => node3 => node4 => node5 => node6). Как я могу написать этот запрос?Учитывая свойство в отношениях, как вернуть атрибуты пути и узла?

Условение заключается в ограничении только отношений и с определенным свойством. Например, все отношения являются типами: KNOWS, но тогда есть атрибут на нем «signal», и я хочу запускать запрос только для отношений r: KNOWS, где r.signal = 10.

Ниже приведено что работает, чтобы получить последние два узла в пути:

MATCH (end)<-[r:knows]-(node) 
WHERE r.signal = 10 
AND end.name = 4 
RETURN node.name, end.name, r.signal 

Вот моя следующая попытка с помощью *, чтобы получить все длины, и комбинацию фильтра и извлечь для обработки коллекции:

MATCH (end)<-[r:knows*]-(node) 
WHERE end.name = 4 
WITH end, node, [x IN r WHERE x.signal = 10 | x.signal] as signals 
RETURN node.name, end.name, signals 

Но это все еще не совсем верно, так как он возвращает все итерации, и только пара s. Я хотел бы найти самый длинный путь и вернуть массив всех имен узлов (не только пары за раз). Любые указатели на то, как подойти к этому, очень ценятся, или полезные ссылки на учебные пособия. Я уже сделал онлайн-обучение neo4j.

ответ

0

Вот способ, чтобы получить максимальную длину/самый длинный путь:

MATCH p=(end {name: 4})<-[r:knows*]-(node) 
WITH max(length(p)) as longestPathLength 
MATCH p2=(end {name: 4})<-[r:knows*]-(node) 
WITH [x IN nodes(p2) | x.signal] as signals, 
    p2 as p2, 
    longestPathLength as longestPathLength 
WHERE length(p2) = longestPathLength 
RETURN p2, signals; 

Во-первых, необходимо соответствие пути и присваиваем его переменной, здесь p и p2. Вы можете извлечь имена узлов, используя функцию сбора, как было, через nodes(p2). Наконец, чтобы найти самую длинную длину пути, просто найдите все из них и выберите путь с максимальной длиной. Затем вернитесь и извлеките только имена узлов из путей, которые имеют такую ​​длину.

Возможно, это не самый эффективный способ сделать это, но похоже, что он работает.

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