Neo4j:与Cypher在距离3处的K-Hop

时间:2016-04-28 12:24:08

标签: neo4j cypher traversal

是否有可能从起始节点获得与其完全相距3的节点?

我知道使用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做同样的事情?

1 个答案:

答案 0 :(得分: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. 首先,我们从起始节点
  2. 找到长度为3的所有路径
  3. 然后计算每个路径中唯一节点的数量
  4. 如果节点编号比路径长度多一个,那么路径不会自相交,并返回此路径中的最后一个节点
  5. 更新:添加检查没有短路径且小于所需长度。