2

私は neo4j グラフ データベースを持っていて、Java を埋め込んで使用しています。このサイファー クエリを Java コードに変換するにはどうすればよいですか (それはまったく可能ですか)。

クエリ:

START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
  WHERE length(path)= maxLength) AS longestPaths

このクエリは、お互いに STATUS="on" プロパティと関係があるノード間で最長のパスを見つけ、そのパスを返します。

私はneo4jデータベースでの作業を読んだので、Java APIからはJavaアプリケーションからサイファークエリを実行するよりも高速です。

このサイファークエリと同じことを行うJavaコードを書くのを手伝ってください。

前もって感謝します。

4

1 に答える 1

3

トラバーサル フレームワークについて言及している場合、これが最善の策です: http://docs.neo4j.org/chunked/stable/tutorial-traversal.html

どちらが速いかを判断するために、独自のパフォーマンス テストを行う必要があるでしょう。

私のJavaは少し錆びており、実際にこれをテストする手段がすぐにはありません. しかし、これはあなたが望むものを得ると思います。

List<Path> longestPaths = null;
int longestLength = 0;

for ( Path position : Traversal.description()
        .depthFirst()
        .relationships( Rels.INCLUDE )
        .relationships( Rels.LIKES, Direction.OUTGOING )
        .evaluator( new Evaluator {
            public Evaluation evaluate(Path path) {
                Relationship r = path.lastRelationship();
                if(r != null && "on".equals(r.getProperty("status"))) {
                    return Evaluation.INCLUDE_AND_CONTINUE;
                }

                return EXCLUDE_AND_PRUNE;
            }
        } )
        .traverse( node ) )
{
    //Given that node is your start node this would be the (WHERE ALL rels status = on)

    if(longestPaths == null || longestLength < position.length()) {
        longestPaths = new ArrayList<Path>();
        longestPaths.add(position);
        longestLength = position.length();
    }
}

//At this point you should have a collection of the longest paths
于 2013-11-04T21:41:06.377 に答える