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

标签 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 查询比较字符以影响最终顺序的方式吗?

最佳答案

如果我理解您的要求,您想要使用 ORDER BY、OFFSET 和 LIMIT 来选择您要显示的哪些结果,然后您想要另一个 ORDER BY 来确定您将显示这些结果的顺序(可能与您用来选择它们的顺序不同)。您可以使用嵌套查询来做到这一点:

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

自定义排序的支持不多,但您可以在顺序表达式中使用函数,并且可以提供多个表达式以先按一件事排序,然后再按另一件事排序。在您的情况下,看起来您可能想要执行 order lcase(?value) 之类的操作以不区分大小写地进行排序。 (当然,这并不完美。例如,我不清楚是否要对数字前缀进行数字排序(例如,顺序应该是 1、10、2 还是 1、2、10)。 )

关于sorting - 如何为 SPARQL 查询设置排序规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38961492/

相关文章:

javascript - 用引号在javascript中对数组进行排序

json - MarkLogic 8 - 即使我们指定了 JSON,Rest 端点也返回 XML

csv - tarql 中带有空格的列名

java - 触发 Stardog 规则的 SPARQL 查询

sparql - 语义网 - Jena sparql

python-2.7 - MarkLogic/Python 查询仅搜索一个文件

xquery - 我可以在 Marklogic Server 的 xquery 中声明一个全局变量吗?

Scala向量拼接(维护排序序列)

C# Winforms DataGridView 绑定(bind)新数据源时排序列丢失

c++ - 交换 std::list 中的相邻元素