想象一下这样的 GraphQL 查询:
Query {
projects(platforms: [String], languages: [String])
}
Project还有一个 Neo4j 图,其中包含标记为Platform和的节点Language。
当未传递任何可选参数时,解析器应返回图中所有项目的列表,不进行过滤(将来可能会进行分页)。当传递一个或所有参数时,这些参数应该应用于底层查询;即我们应该得到以给定语言或给定平台实现的项目。
我在 Elixir 后端使用 Neo4j 的 Bolt.Sips 驱动程序,并且该驱动程序提供了用于包装 Cypher 查询语言的最小功能,因此在大多数情况下,我需要自己编写查询。到目前为止,我已经实现了解析器,因为我还没有实现第二个参数:
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
wheregeneric_query!/2和get_all_entities_of_type!/1只是 Bolt.Sips 查询执行的包装器。
我的问题是:在这种情况下构建 Cypher 查询的最佳方法是什么?我应该只写一堆在执行前构造查询字符串的函数吗?也许这只是我普遍缺乏 GraphQL 经验,并且像这样的查询模式要以不同的方式构建?任何提示将不胜感激。