6

CONTEXT : neo4j データベースに支えられた Java Spring Boot システムを開発しています。「ClassRepo extends GraphRepository」構造を使用してデータベースにアクセスします。クエリの作成は、正確なクエリをハード コーディングし、その特定の部分を指定されたパラメーター (この場合は courseName) に置き換える単純なケースです。

@Query("MATCH (node:Course) WHERE node.name = {courseName}  RETURN node LIMIT 1")
Course findByName(@Param("courseName") String name);

これはすべて問題なく機能し、1 つまたは複数の結果を問題なく返すことができました。しかし、私のプロジェクトが発展するにつれて、検索するためのオプションの大きなリストを提供するようになりました (ファセット検索、Amazon 製品フィルターを考えてください)。選択された、または選択されていないフィルタリングオプションのすべての順列に対して静的暗号クエリを作成するのはばかげているようです。

私の解決策(試み)は、クエリの一部をパラメーターとして渡すことでした。つまり、文字列クエリビルダーを作成します。

@Query("MATCH (course:Course) -[r]-> (description:CourseYearDescription) " +
        "WITH course, count(description) as relationCount, collect(description) as descriptions " +
        "WHERE relationCount > {numberOfYears} {returnCourse}")
Iterable<Course> findCourseWithNumberOfYears(
        @Param("numberOfYears") int numberOfYears,
        @Param("returnCourse") String returnCourse
);

ここで、「returnCourse」は「RETURN course」という値を持つ文字列です。クエリ文字列に静的に入力された「RETURN course」が機能することは事実です。私はそれを削除し、文字列値をパラメーターとして渡して、同じクエリを生成して実行時に実行できるかどうかを確認しました。

これは実際には成功せず、エラーページに戻り、次のスタックを出力しました: http://pastebin.com/J9VBfpxw

質問: GraphRepository で使用されるサイファー クエリ文字列に文字列を追加/挿入して、クエリを動的に変更できるようにする方法はありますか。つまり、実行時に一致クエリの末尾に where 句を追加します。

4

1 に答える 1

6

いいえ、ありません。SDN/Neo4j OGM は実行時にカスタム クエリを変更せず、Cypher エンジンによって実行されるようにそれらを渡すだけです。したがって、パラメーター化できるのは、Cypher が許可するものだけです ( http://neo4j.com/docs/stable/cypher-parameters.html )。

バリエーションごとに複数の @Query ステートメントを定義することは意味がないことに同意しますが、できることは、クエリを文字列として作成し、動的に生成された Cypher クエリとパラメーターのマップを受け入れる Neo4jOperations.query* メソッドを使用することです。 (繰り返しますが、Cypher ステートメントで有効なパラメーターです)。

それが役立つことを願っています。

于 2016-01-25T03:42:48.067 に答える