2016-05-21 3 views
2

Я новичок в Neo4j. У меня есть простой граф, и я хочу, чтобы все узлы, которые почти почти (расстояние менее 5, например), были связаны с одним узлом. Также мне нужен путь от источника к ним. Это может быть сделано только одним источником bfs из источника. Со следующим шифровальщика запроса:Найти дерево bfs в Neo4j

Match c=(sourceNode:Person {name:'Demi Moore'})-[relation*1..5]-(destNode) 
    return c 
    limit 10 

Запрос возвращает все пути с длиной < = 5 от источника, но destNode не будет отличаться. поэтому результат может иметь несколько путей к одному и тому же узлу dest.

С помощью следующего запроса:

Match c=(sourceNode:Person {name:'Demi Moore'})-[relation*1..5]-(destNode) 
    return distinct destnode 
    limit 10 

Запрос возвращает только destNodes не путь. Если я изменю предложение return на return distinct destnode, c, запрос также вернет строку на каждый найденный путь! Я знаю, что могу получить кратчайший путь от источника до каждого отдельного destnode. Если найду, но у него есть проблема с производительностью. Результат может быть найден одним bfs, и я думаю, что у любой базы данных графика есть инструмент по умолчанию, я не прав?

ответ

0

Я думаю, что вам нужно:

  • опционально добавить направление отношений;
  • сортировать по длине пути;
  • группа по destNode и собирать путь;
  • return destNode и первый путь от сбора.

Match (sourceNode:Person {name:'Demi Moore'}) 
    With sourceNode 
    Match path = (sourceNode) -[:relation*1..5]-> (destNode:Person) 
    With destNode, path 
     Order By Length(path) ASC 
Return destNode, Head(Collect(path)) As path 
    Order By Length(path) ASC 
Limit 10 
+0

Не вызывает ли этот запрос поиск всех путей к каждому узлу? –

+0

Не все, но только один из самых коротких для каждого узла в течение пяти шагов. Разве это не то, что вы хотите? –

+0

Это то, что я хочу, но я думаю, что Neo4j должен найти все исправления от источника до одного узла, а затем упорядочить их по lengh. не так ли ?! –

0

делать ли это, что вы хотите?

MATCH p = (:Person {name:'Demi Moore'})-[*1..5]-(destNode) 
WITH destNode, COLLECT(p) AS paths 
RETURN destNode, REDUCE(s = paths[0], x IN paths[1..] | CASE WHEN LENGTH(x) < LENGTH(s) THEN x ELSE s END) AS path 
limit 10; 

Он использует COLLECT агрегировать все пути, для одной и той же destNode, а затем использует REDUCE, чтобы найти один из в кратчайших к каждому destNode.

+0

Не вызывает ли этот запрос поиск всех путей к каждому узлу ?! –

+0

Он возвращает все узлы, которые находятся на расстоянии до 5 от узла «Деми Мур», с * одним из * кратчайших путей к каждому из таких узлов. – cybersam

+0

Да, но это случай neo4j, чтобы найти весь путь от исходного узла к узлу, собрать патчи, а затем найти самый короткий. Я думаю, что это намного медленнее, чем один бит. –

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