Модификатор решения ORDER BY в шаблоне CONSTRUCT SPARQL

Я следил за разделом 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> ...

person Margi    schedule 26.02.2014    source источник
comment
Какой точный синтаксис вы использовали и какую ошибку получили?   -  person Jeen Broekstra    schedule 26.02.2014
comment
Также покажите пример вывода запроса - как фактический результат, так и ожидаемый результат.   -  person Jeen Broekstra    schedule 26.02.2014
comment
Принятый ответ объясняет, как вы можете исправить проблему с синтаксисом, но важно отметить, что результатом запроса construct является граф RDF, который представляет собой набор (и, следовательно, неупорядоченный набор) троек. Здесь order by ничего для вас не делает, если только вы не используете его вместе с limit (и, возможно, offset) для выбора некоторого подмножества всех возможных результатов.   -  person Joshua Taylor    schedule 26.02.2014
comment
@JoshuaTaylor Хотя стандарт SPARQL не гарантирует порядок троек в завершенном графе RDF (просто потому, что такой граф по определению неупорядочен), реализациям все равно потребуется обрабатывать последовательность решений в упорядоченной форме. Таким образом, в механизмах запросов, которые сообщают результаты запроса итеративно, тройки на практике будут сообщаться в определенном порядке.   -  person Jeen Broekstra    schedule 26.02.2014
comment
@JeenBroekstra Да, и это хороший момент; это может сделать результаты немного более приемлемыми для определенных приложений. Тем не менее, Марги [хочет] получить результаты в порядке возрастания/убывания даты события, и, хотя это устраняет ошибку синтаксического анализа, это не гарантированный способ [получения] результатов в порядке возрастания/убывания даты события. Я просто не хочу вводить Марги в заблуждение. :)   -  person Joshua Taylor    schedule 26.02.2014


Ответы (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)

Также обратите внимание, что некоторые из фигурных скобок в исходном запросе хотя и не совсем неправильные, но лишние.

person Jeen Broekstra    schedule 26.02.2014
comment
Это решит проблему синтаксиса, но также важно отметить, что результатом запроса construct является граф, т. е. (неупорядоченный) набор троек; order by на самом деле здесь ничего не делает, если только он не используется вместе с limit (и, возможно, offset) для ограничения содержимого результата. - person Joshua Taylor; 26.02.2014
comment
@JoshuaTaylor Это правда. Однако, хотя стандарт SPARQL не гарантирует порядок троек в завершенном RDF-графе (просто потому, что такой граф по определению неупорядочен), реализациям все равно потребуется обрабатывать последовательность решений в упорядоченной форме. . Таким образом, в механизмах запросов, которые сообщают результаты запроса итеративно, тройки на практике будут сообщаться в определенном порядке. - person Jeen Broekstra; 26.02.2014
comment
Это не относится к Йене Фусеки, по крайней мере, в последней версии. Запрос select возвращает результаты упорядоченным образом, а запрос construct возвращает результаты неупорядоченным образом. - person Sébastien Rosset; 03.02.2021