【发布时间】:2017-08-17 14:18:49
【问题描述】:
我需要找到节点之间的最短路径,但在良好路径中对关系类型有一些限制。
我有两种关系类型:A 和 B。 如果路径有两个或多个 B 类型的连续关系,则该路径被认为是错误的:
好的路径:()-A->()-A->()()-A->()-B->()
错误路径:()-A->()-A->()-B->()()-A->()
Cypher 查询:
MATCH path=allShortestPaths( (p:P{idp:123})-[rel:A|B*]-(p2:P{idp:124}) )
WHERE *some-predicate-on-path-or-rel*
RETURN path
不是解决方案,因为最短的好路径可能比最短的坏路径长。
Q1:这个问题可以通过一些 Cypher 查询来解决吗?
我可以使用嵌入式 Java Neo4J API 解决我的问题:
GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("db/store/dir/path");
TraversalDescription td = graphDb.traversalDescription()
.breadthFirst()
.evaluator(Evaluators.toDepth(max_depth))
.evaluator(Evaluators.endNodeIs(Evaluation.INCLUDE_AND_PRUNE, Evaluation.EXCLUDE_AND_CONTINUE, endNode))
.evaluator(new DoubleB_PruneEvaluator());
static class DoubleB_PruneEvaluator implements Evaluator {
@Override
public Evaluation evaluate(final Path path) {
Iterator<Relationship> lRels = path.reverseRelationships().iterator();
if (lRels.hasNext() && lRels.next().isType(MyRelTypes.B)) {
if (lRels.hasNext() && lRels.next().isType(MyRelTypes.B))
return Evaluation.EXCLUDE_AND_PRUNE;
}
return Evaluation.INCLUDE_AND_CONTINUE;
}
}
Q2:这个解决方案是否相当有效?或者如何改进?
但我的应用程序是用 PHP 编写的,并通过 REST 协议与 Neo4j 服务器交互。
Q3:如何通过一些 REST 查询来运行这个解决方案?
【问题讨论】:
标签: neo4j cypher shortest-path