代码之家  ›  专栏  ›  技术社区  ›  Stream Major

Neo4j:K-Hop与Cypher距离3

  •  0
  • Stream Major  · 技术社区  · 10 年前

    是否可以从起始节点获取距离它正好为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 回复  |  直到 10 年前
        1
  •  0
  •   stdob--    10 年前
    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(升级) :添加检查,确保没有小于所需长度的短路径。