次のような GraphQL クエリを想像してください。
Query {
projects(platforms: [String], languages: [String])
}
およびというラベルProject
の付いたノードを含む Neo4j グラフ。Platform
Language
オプションの引数がどれも渡されない場合、リゾルバーはグラフ内のすべてのプロジェクトのリストをフィルタリングせずに返す必要があります (将来的にはページネーションを使用する可能性があります)。いずれかまたはすべての引数が渡されると、それらは基になるクエリに適用される必要があります。つまり、特定の言語または特定のプラットフォーム用に実装されたプロジェクトを取得する必要があります。
Elixir バックエンドで Neo4j 用の Bolt.Sips ドライバーを使用しています。このドライバーは、Cypher クエリ言語をラップするための最小限の機能を提供するため、ほとんどの場合、自分でクエリを作成する必要があります。これまでのところ、2 番目の引数をまだ実装していないため、このリゾルバーの実装があります。
def get_projects!(_parent, %{languages: _} = args, _resolution) do
"""
match (node:Project)<-[:LANGUAGE_FOR]-(l:Language)
where l.name in {props}.languages
return node
"""
|> generic_query!(%{props: args})
end
def get_projects!(_parent, _args, _resolution) do
get_all_entities_of_type!("Project")
end
generic_query!/2
とはget_all_entities_of_type!/1
、Bolt.Sips クエリ実行の単なるラッパーです。
私の質問は次のとおりです。この場合、Cypher クエリを作成する最良の方法は何ですか? 実行前にクエリ文字列を作成する一連の関数を作成する必要がありますか? たぶん、GraphQLの経験が私の一般的な不足であり、このようなクエリスキーマは別の方法で構築されるのでしょうか? ヒントをいただければ幸いです。