【问题标题】:ORDER BY solution modifier in CONSTRUCT pattern of SPARQLSPARQL CONSTRUCT 模式中的 ORDER BY 解决方案修饰符
【发布时间】:2014-02-26 00:27:03
【问题描述】:

我遵循了 SPARQL 1.1 部分 10.2 CONSTRUCT 并进行了以下 SPARQL 查询,该查询返回所有三元组,其主题类型为 Homework 并且还具有事件日期。

CONSTRUCT  { ?s ?p ?o } WHERE 
{
 GRAPH ?g { ?s ?p ?o } .
 { ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
    <http://lod.isi.edu/ontology/syllabus/Homework> 
 }.

 { ?s <http://lod.isi.edu/ontology/syllabus/hasEventDate> ?date}.
}

现在,我想以事件日期?date 的升序/降序检索结果。我尝试添加order by 修饰符,如下所示,但在 OpenRDF 工作台中存在解析错误。

CONSTRUCT  { ?s ?p ?o } WHERE 
{
 GRAPH ?g { ?s ?p ?o } .
 { ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
    <http://lod.isi.edu/ontology/syllabus/Homework> 
 }.

 { ?s <http://lod.isi.edu/ontology/syllabus/hasEventDate> ?date}.
 ORDER BY DESC(?date)

}
Encountered " "order" "ORDER "" at line 9, column 6. Was expecting one of:
"(" ... "{" ... "}" ... "[" ... <NIL> ... <ANON> ... "optional" ...
"graph" ... "minus" ... "filter" ... "true" ... "false" ... "bind" ...
"service" ... "values" ... <Q_IRI_REF> ... <PNAME_NS> ... <PNAME_LN> ...
<BLANK_NODE_LABEL> ... <VAR1> ... <VAR2> ... <INTEGER> ... <INTEGER_POSITIVE> ...
<INTEGER_NEGATIVE> ... <DECIMAL> ... <DECIMAL_POSITIVE> ...
<DECIMAL_NEGATIVE> ... <DOUBLE> ... <DOUBLE_POSITIVE> ...
<DOUBLE_NEGATIVE> ... <STRING_LITERAL1> ... <STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ... <STRING_LITERAL_LONG2> ...

【问题讨论】:

  • 您使用的确切语法是什么,您遇到了什么错误?
  • 另外请显示查询的示例输出 - 实际输出和预期输出。
  • 接受的答案解释了如何解决语法问题,但重要的是要注意 construct 查询的结果是一个 RDF 图,它是一个集合(因此是一个 无序的 集合)三元组。 order by 在这里不会为您做任何事情,除非您将它与 limit(可能还有 offset)结合使用以选择所有可能结果的某个子集。
  • @JoshuaTaylor 虽然 SPARQL 标准不保证完整 RDF 图中三元组的顺序(因为这样的图根据定义是无序的),但实现仍需要按顺序处理解决方案序列形式。因此,在以迭代方式报告查询结果的查询引擎中,实际上将按定义的顺序报告三元组。
  • @JeenBroekstra 是的,这是一个很好的观点;这可能会使结果对某些应用程序更可口。尽管如此,Margi“[想要]以事件日期的升序/降序检索结果”,虽然这修复了解析错误,但它不是“[检索]以事件的升序/降序排列结果的保证方式日期”。我只是不想误导玛吉。 :)

标签: rdf sparql sesame openrdf


【解决方案1】:

问题是您的ORDER BY 子句在查询中的位置不正确。它应该在结束 WHERE 子句的右括号之后:

CONSTRUCT  { ?s ?p ?o } 
WHERE 
{
 GRAPH ?g { ?s ?p ?o } 
 ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://lod.isi.edu/ontology/syllabus/Homework> .
 ?s <http://lod.isi.edu/ontology/syllabus/hasEventDate> ?date .
}
ORDER BY ASC(?date)

另请注意,原始查询中的几个大括号是多余的,尽管并非完全错误。

【讨论】:

  • 这将解决语法问题,但同样重要的是要注意 construct 查询的结果是一个图,即(无序的)集合三元组; order by 在这里实际上并没有做任何事情,除非它与limit(可能还有offset)一起使用来限制结果的内容。
  • @JoshuaTaylor 这是真的。然而,虽然 SPARQL 标准不保证完整 RDF 图中三元组的顺序(仅仅因为这样的图根据定义是无序的),但实现仍需要以有序形式处理解序列.因此,在以迭代方式报告查询结果的查询引擎中,实际上将按定义的顺序报告三元组。
  • 这不是 Jena Fuseki 的情况,至少在最新版本中是这样。 select 查询以有序方式返回结果,而construct 查询以无序方式返回结果。
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-25
  • 2016-02-02
相关资源
最近更新 更多