2016-04-28 2 views
0

Можно ли получить от начального узла узлы, которые находятся точно на расстоянии 3 от него?Neo4j: K-Hop на расстоянии 3 с Cypher

Я знаю, что это возможно, чтобы достичь этого результата с Neo4j Java API и его рамки: транспортер

TraversalDescription td = graphDb.traversalDescription() 
          .breadthFirst() 
          .relationships(Neo4JBenchmark.RelTypes.Knows, Direction.OUTGOING) 
          .uniqueness(Uniqueness.NODE_GLOBAL) 
          .evaluator(Evaluators.excludeStartPosition()) 
          .evaluator(Evaluators.fromDepth(3)) 
          .evaluator(Evaluators.toDepth(3)); 
ResourceIterator<Node> traverser = td.traverse(startNode).nodes().iterator(); 

мне было интересно, если я могу сделать то же самое с Cypher?

ответ

0
MATCH path = (a)-[:knows*3..3]->(c) 
    WHERE id(a) = startNodeID 
    WITH path, 
     shortestPath ((a)-[:knows*..2]->(c)) as sPath 
    WHERE sPath IS NULL 
    UNWIND nodes (path) as node 
     WITH path, 
      collect (distinct node) as collect 
     WHERE size (collect) = length (path) + 1 
RETURN 
    DISTINCT collect [ length (path) ] 
  1. Сначала мы находим все пути длины 3 из стартового узла
  2. Затем подсчитывают количество уникальных узлов в каждом пути
  3. Если число узлов на единицу больше длины пути , то путь не самопересекающийся и возвращает последний узел на этом пути

UPD: Добавить проверить, что нет короткого пути с меньшими затратами, чем требуется длина.

+0

Привет, результат, возвращаемый этим запросом, не совпадает с результатом, возвращаемым трафиком APi. Это немного сложно, представьте себе пример: 1-> 2-> 3-> 4 и 1-> 4, узел 4 находится на расстоянии 1, а не на расстоянии 3 от узла 1. Однако ваш запрос будет считать его на расстоянии 3. –

+0

Привет, n/p - см. обновление :) –

+1

ОК спасибо, теперь все в порядке, но удалите «,» после «спама» в вашем запросе;) –