1

想象一下这样的 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!/2get_all_entities_of_type!/1只是 Bolt.Sips 查询执行的包装器。

我的问题是:在这种情况下构建 Cypher 查询的最佳方法是什么?我应该只写一堆在执行前构造查询字符串的函数吗?也许这只是我普遍缺乏 GraphQL 经验,并且像这样的查询模式要以不同的方式构建?任何提示将不胜感激。

4

0 回答 0