如何为SPARQL查询设置排序规则?

时间:2016-08-15 19:13:28

标签: sorting sparql marklogic collation

我是一名使用MarkLogic数据库的Java开发人员。我的代码的一个关键功能是它能够动态生成4-6个SPARQL查询并通过HTTP GET请求运行它们。将每个的结果加在一起然后返回。我现在需要这些结果一致地排序。

由于我正在分页每个查询的结果(使用LIMIT和OFFSET语句),每个查询都有自己的ORDER BY语句。如果不将排序嵌入到查询中,结果页面将无序返回。

但是,每个查询都会返回自己的结果,这些结果是单独排序的,需要合并到一个排序列表中。我的偏好是在考虑大小写之前考虑字符的字母数字排序,并将空值和空值排序到最后。 (例如:“0123456789AaBbCc ... WwXxYyZz”)

我已经使用自定义比较方法在我的Java代码中完成了这个,但是我最近遇到了一个问题:我的结果仍然没有返回排序。我遇到的问题源于这样一个事实,即我的自定义排序方案与SPARQL使用的方案完全分开,导致一组明确未排序的结果。虽然我考虑在返回结果之前从头开始对结果进行排序,而不是假设MarkLogic返回排序结果,但这似乎不必要地浪费,甚至可能无法解决我的问题。

在我的研究中,我无法找到任何方法来为SPARQL设置排序规则,也没有找到编写自定义排序规则的方法。此页面上的文档(https://www.w3.org/TR/rdf-sparql-query/#modOrderBy)明确指出SPARQL的ORDER BY基于XPATH的fn:compare驱动的比较方法。该函数引用此页面(https://www.w3.org/TR/xpath-functions/#collations),该页面专门提到了用于指定排序规则的选项以及使用Unicode排序规则算法的替代实现。我找不到的是详细说明如何实际做到的事情。

简而言之,我有什么方法可以操纵或控制SPARQL查询如何比较字符以影响最终订单?

3 个答案:

答案 0 :(得分:4)

如果我理解你要问的内容,你想使用ORDER BY,OFFSET和LIMIT来选择你要显示的结果,然后你想要另一个ORDER BY确定您显示这些结果的顺序(可能与您用于选择结果的顺序不同)。您可以使用嵌套查询来执行此操作:

select ?result {
  { select ?result where {
      #-- ...
    }
    order by #-- ...
    offset #-- ...
    limit #-- ...
  }
}
order by #-- ...

自定义排序并不是很多,但您可以在订单表达式中使用函数,并且您可以提供多个表达式来先排序,然后按另一个。在您的情况下,您可能希望执行类似命令lcase(?value)的操作,以区分大小写。 (当然,这不会是完美的。例如,我不清楚你是否想要数字排序数字前缀(例如,顺序是1,10,2或1) ,2,10)。)

答案 1 :(得分:2)

我刚从SPARQL实施者那里得到了明确的答案。

SPARQL规范并未真正解决排序规则问题。 MarkLogic对SPARQL排序使用unicode代码点排序规则。

但是,我们需要了解您的要求。如您所知,MarkLogic支持各种排序规则,并且支持内置于支持SPARQL的代码中 - 我们根本没有公开如何利用SPARQL排序规则的接口。

MarkLogic正在关注这个主题,所以请随意提出这个请求,或许建议您如何考虑从查询中访问排序规则,我们会看到它。

答案 2 :(得分:1)

我与MarkLogic的Kevin Morgan就此事进行了联系,他非常乐于助人。我们昨天召开了一次WebEx会议讨论了问题的各种解决方案,并且进展顺利。

他们的工程师证实,到目前为止,没有办法强制SPARQL使用特定的排序顺序。他们为我的问题提出了两个有希望的解决方案:

•在您的文档中嵌入三元组并利用文档搜索和范围索引:虽然这适用于多个系统设计,但它不适用于我们的系统。排序和分页属于产品升级,我们不能要求我们的客户完全重新提取他们的数据,因此我们可以应用这个新标准。

•在XQuery语句中包装SPARQL查询:此方法使用SPARQL确定整个结果集,然后在XQuery中使用自定义排序规则来处理排序。分页也在XQuery中处理(出于显而易见的原因,在排序之前分页会破坏两者)。

第二种解决方案似乎对我们有用,但在我们认真考虑实施之前,我需要研究性能成本。顺便说一下,我觉得很奇怪SPARQL的排序在构建它的XQuery函数时不支持排序规则。假设其用户永远不希望使用除基本Unicode Codepoint排序之外的任何其他内容对未标记的文字值进行排序似乎是不合逻辑的。在什么时候我采用构建在XQuery上的东西并将其嵌入XQuery中是合理的,因为它似乎是创造者“遗漏了什么?”