在DSL中构造查询时,如何在Absinthe GraphQL解析器中处理多个可选参数?

时间:2019-04-04 18:16:52

标签: neo4j cypher graphql absinthe

像这样想象一个GraphQL查询:

Query {
  projects(platforms: [String], languages: [String])
}

还有一个Neo4j图,其中包含标记为ProjectPlatformLanguage的节点。

当不传递任何可选参数时,解析程序应返回图中所有项目的列表,且不进行过滤(将来可能会进行分页)。当传递一个或所有参数时,应在基础查询中应用这些参数;也就是说,我们应该获得以特定语言或特定平台实施的项目。

我在我的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

其中generic_query!/2get_all_entities_of_type!/1只是Bolt.Sips查询执行的包装。

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

0 个答案:

没有答案