如何合并两个SPARQL查询并按首列分组对第二列数值求和
SPARQL多查询结果合并分组求和实现方案
方案1:SPARQL查询层直接实现(推荐)
直接在SPARQL中通过UNION对齐两个查询的输出字段,再在外层套分组聚合逻辑,无需额外处理返回结果。
具体查询示例如下:
SELECT ?letter (SUM(xsd:integer(?num)) AS ?total) WHERE { { # 原查询1,统一输出字段为?letter和?num SELECT ?letter (?number AS ?num) WHERE { # 原查询1的WHERE逻辑完整保留即可 } } UNION { # 原查询2,对齐输出字段为?letter和?num SELECT (?anotherletter AS ?letter) (?anotherNumber AS ?num) WHERE { # 原查询2的WHERE逻辑完整保留即可 } } } GROUP BY ?letter ORDER BY ?letter
注意:如果你的数值字段是字符串类型的字面值,需要先用
xsd:integer()或者xsd:float()转换为数值类型,否则SUM聚合会失效。
方案2:应用层聚合实现
如果不方便修改SPARQL查询,也可以分别执行两个查询后,在业务代码中用哈希表(字典)做聚合,以Python为例的实现逻辑如下:
# 模拟两个查询的返回结果,格式为(字符, 数值)的元组列表 query1_res = [("a", 1), ("b", 2), ("d", 4)] query2_res = [("b", 2), ("c", 3)] res_dict = {} # 聚合第一个查询结果 for letter, num in query1_res: res_dict[letter] = res_dict.get(letter, 0) + num # 聚合第二个查询结果 for letter, num in query2_res: res_dict[letter] = res_dict.get(letter, 0) + num # 输出最终结果,按字符排序 final_res = sorted(res_dict.items(), key=lambda x:x[0]) print(final_res) # 输出 [('a', 1), ('b', 4), ('c', 3), ('d', 4)]
内容的提问来源于stack exchange,提问作者SolarOsQuiere
相关产品推荐
相关产品推荐

