ノード間の最短経路を見つける必要がありますが、良好な経路の関係タイプにはいくつかの制限があります。Neo4J:特定の関係タイプを持つ最短経路シーケンス制約
Iは、2つの関係タイプを有する:
グッドパス:それはタイプBの2つの以上の連続した関係を有する場合& 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クエリで解決できますか?
私は、組み込みの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で書かれており、Neo4jサーバーとRESTプロトコルでやりとりします。
Q3:いくつかのRESTクエリでこのソリューションを実行するにはどうすればよいですか?