像这样想象一个GraphQL查询:
Query {
projects(platforms: [String], languages: [String])
}
还有一个Neo4j图,其中包含标记为Project
,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
其中generic_query!/2
和get_all_entities_of_type!/1
只是Bolt.Sips查询执行的包装。
我的问题是:在这种情况下构造Cypher查询的最佳方法是什么?我是否应该只编写一堆函数,这些函数会在执行之前构造一个查询字符串?也许仅仅是我普遍缺乏GraphQL经验,而这样的查询模式将以不同的方式构造?任何提示将不胜感激。