노드 사이의 최단 경로를 찾아야하지만 올바른 경로의 관계 유형에 대한 제한 사항이 있습니다.Neo4J : 특정 관계 유형이있는 최단 경로 시퀀스 제한
나는 두 가지 관계 유형이 : 그것은 B 형의 두 개 이상의 연속적인 관계가 경우 & B. 경로가 나쁜 것으로 간주됩니다 :
좋은 경로 :() -A ->() - A->() < -A -() - B ->() - A ->() - B ->()
잘못된 경로 :() - A ->() - A ->() < -A-) -B ->() < -B-() - A ->()
사이퍼 쿼리
MATCH path=allShortestPaths((p:P{idp:123})-[rel:A|B*]-(p2:P{idp:124}))
WHERE *some-predicate-on-path-or-rel*
RETURN path
은 최단 경로가 최단 경로보다 길기 때문에 해결 방법이 아닙니다.
1 : 일부 Cypher 쿼리에서이 문제를 해결할 수 있습니까?
나는 임베디드 자바 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 쿼리로 어떻게이 솔루션을 실행할 수 있습니까?