Neo4j:距离为 3 的 K-Hop 与 Cypher
Neo4j : K-Hop at distance 3 with Cypher
是否可以从起始节点获取恰好距离它 3 的节点?[=11=]
我知道使用 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 做同样的事情?
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) ]
- 首先我们找到从起始节点开始的所有长度为3的路径
- 然后统计每条路径中唯一节点的个数
- 如果节点号比路径长度多1,则路径不自相交,return这条路径的最后一个节点
Upd: 添加检查是否有短路径小于要求的长度。
是否可以从起始节点获取恰好距离它 3 的节点?[=11=]
我知道使用 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 做同样的事情?
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) ]
- 首先我们找到从起始节点开始的所有长度为3的路径
- 然后统计每条路径中唯一节点的个数
- 如果节点号比路径长度多1,则路径不自相交,return这条路径的最后一个节点
Upd: 添加检查是否有短路径小于要求的长度。