【问题标题】:How do you set the Collation for a SPARQL query?如何为 SPARQL 查询设置排序规则?
【发布时间】:2016-08-15 19:13:27
【问题描述】:

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

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

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

我已经在我的 Java 代码中使用自定义比较方法做到了这一点,但我最近遇到了一个问题:我的结果仍然没有返回 sorted。我遇到的问题源于这样一个事实,即我的自定义排序方案与 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 查询如何比较字符以影响最终顺序?

【问题讨论】:

  • 我认为自定义排序取决于三元组存储和 SPARQL 引擎。我不知道 MarkLogic,但我想如果存在这样的选项,开发人员会知道,直接向他们寻求帮助可能会更快。
  • 我不确定我是否理解你。您是否建议我询问为 MarkLogic 工作的开发人员?
  • 是的,至少 w.r.t.一些特定于工具的自定义订单支持。如果没有,那么您唯一能做的就是@JoshuaTaylor 在下面的回答中显示的内容。

标签: sorting sparql marklogic collation


【解决方案1】:

如果我理解您的要求,您想使用 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)。 )

【讨论】:

  • 看来我可能需要以我想要的方式处理大写和小写字母的排序。下一个问题是重写我的比较方法以匹配 SPARQL。从我在这里读到的(blog.dydra.com/2015/05/06/collation)看来,如果你的三元组有一个特定的语言标签,那么它们可以根据该语言的规则进行排序。但是我没有找到太多关于默认值的文档。即使从我的集合中提取每个三元组并梳理结果,我也没有看到任何语言标签,这让我想知道它自然应用的顺序是什么。
  • @Benjamin 我不确定您所说的“三元组语言标签”是什么意思。没有数据类型的文字可以有语言标签。例如,“color”@en 或“color”@en-GB。三元组本身没有语言标签。
  • 你是对的,我对我在一些三元组的对象中引用文字的方式很粗心。我做了更多阅读,似乎因为我们在存储任何文字时没有应用语言标签,所以 SPARQL 不会对 ORDER BY 应用任何基于语言的比较。相反,它将“根据 Unicode 代码点”比较它们。虽然这不是我想要的,但它足以让我修改我的 java 代码中的排序,所以一切都是一致的。非常感谢您的帮助。
【解决方案2】:

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

SPARQL 规范并没有真正解决排序规则。 MarkLogic 使用 unicode 代码点排序规则进行 SPARQL 排序。

但是,我们需要了解您的要求。如您所知,MarkLogic 支持各种排序规则,并且这种支持内置于支持 SPARQL 的代码中——我们只是没有公开一个接口来说明如何利用 SPARQL 中的排序规则。

MarkLogic 正在关注此线程,因此请随时提出该请求,也许会建议您考虑如何从查询中访问排序规则,我们会看到它。

【讨论】:

  • 如果 sparql order by 类似于 order by lcase(?variable) 什么排序规则 uri 最适合这个?
【解决方案3】:

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

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

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

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

第二种解决方案似乎对我们有用,但我需要先研究性能成本,然后才能认真考虑实施它。顺便说一句,我觉得非常奇怪的是,SPARQL 的排序不支持排序规则,而它所构建的 XQuery 函数支持排序规则。假设它的用户永远不想使用除了基本的 Unicode 代码点排序之外的任何东西对未标记的文字值进行排序,这似乎是不合逻辑的。什么时候我可以将基于 XQuery 构建的东西嵌入 XQuery 中,因为创建者似乎“遗漏了一些东西”?

【讨论】:

  • “SPARQL 的排序在它所构建的 XQuery 函数执行时不支持排序规则”如果这是真的,那么这将是一个差距。实际上,SPARQL 和 XQuery 都是基于 C++ 构建的,并且是不同的索引样式(范围索引与三重索引)有或没有排序规则。因此,虽然这是一个功能上的差距,但它实际上是为 SPARQL 引擎带来排序规则的一个巨大的 LoE,虽然当你知道它时这是一个明显的差距,但排序规则首先不是 SPARQL 或 RDF 的一部分,所以它不是t 优先将其作为语言扩展来实现。
  • @grechaw,看来我的陈述是基于对实现的不完全理解。我的立场是正确的。
猜你喜欢
  • 2015-05-22
  • 2021-10-22
  • 2013-09-26
  • 2021-03-01
  • 2014-01-05
  • 1970-01-01
  • 2020-05-28
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多