Как использовать GroupBy и GroupConcat в SPARQL - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблема с запросом SPARQL для группирования элементов. Я использую http://kaiko.getalp.org/sparql, чтобы написать свой запрос.

Я использовал GROUP BY на поле. Поскольку было несколько элементов, мой результат представлял собой несколько строк, и я пытаюсь объединить их.

Вот мой оригинальный запрос.

SELECT distinct ?word ?poslexinfo ?posdbnary ?def ?syn ?ant
WHERE { 
 ?f dbnary:describes ?lf. 
 ?lf rdf:type ontolex:LexicalEntry .
 ?lf lime:language "de" . 
 ?lf ontolex:canonicalForm ?wo .
 ?wo ontolex:writtenRep ?word .
 OPTIONAL {?lf lexinfo:partOfSpeech ?poslexinfo} .
 OPTIONAL {?lf dbnary:partOfSpeech ?posdbnary} .
 ?lf ontolex:sense ?os .
 ?os rdf:type ontolex:LexicalSense .
 OPTIONAL {?os dbnary:antonym ?ant} .
 OPTIONAL {?os dbnary:synonym ?syn} .
 ?os skos:definition ?defl .
 ?defl rdf:value ?def
 } LIMIT 5

Результат:

word    poslexinfo  posdbnary   def     syn     ant

"gay"   http://www.lexinfo.net/ontology/2.0/lexinfo#adjective   "Adjektiv"   "sexuelle Neigungen zum eigenen Geschlecht zeigend" http://kaiko.getalp.org/dbnary/deu/homosexuell http://kaiko.getalp.org/dbnary/deu/hetero

"gay"   http://www.lexinfo.net/ontology/2.0/lexinfo#adjective   "Adjektiv"   "sexuelle Neigungen zum eigenen Geschlecht zeigend" http://kaiko.getalp.org/dbnary/deu/homosexuell http://kaiko.getalp.org/dbnary/deu/bi

Обе эти строки отличаются только антонимом, и мой ожидаемый результат -

word    poslexinfo  posdbnary   def     syn     ant

"gay"   http://www.lexinfo.net/ontology/2.0/lexinfo#adjective   "Adjektiv"   "sexuelle Neigungen zum eigenen Geschlecht zeigend" http://kaiko.getalp.org/dbnary/deu/homosexuell http://kaiko.getalp.org/dbnary/deu/hetero|http://kaiko.getalp.org/dbnary/deu/bi

Я попытался выполнить приведенный ниже запрос, используя GroupBy и GroupConcat, но не уверен, что я здесь не так делаю.

Запрос:

SELECT distinct ?word ?poslexinfo ?posdbnary ?def ?syn (GROUP_CONCAT(?ant ; separator="|") AS ?ants)
WHERE { 
 ?f dbnary:describes ?lf. 
 ?lf rdf:type ontolex:LexicalEntry .
 ?lf lime:language "de" . 
 ?lf ontolex:canonicalForm ?wo .
 ?wo ontolex:writtenRep ?word .
 OPTIONAL {?lf lexinfo:partOfSpeech ?poslexinfo} .
 OPTIONAL {?lf dbnary:partOfSpeech ?posdbnary} .
 ?lf ontolex:sense ?os .
 ?os rdf:type ontolex:LexicalSense .
 OPTIONAL {?os dbnary:antonym ?ant} .
 OPTIONAL {?os dbnary:synonym ?syn} .
 ?os skos:definition ?defl .
 ?defl rdf:value ?def
 } GROUP BY ?word LIMIT 5

Когда я пытаюсь выполнить вышеуказанный запрос, я получаю эту ошибку.

Virtuoso 37000 Ошибка SP031: Компилятор SPARQL: Переменная? Syn используется в наборе результатов вне агрегата и не упоминается в предложении GROUP BY

1 Ответ

0 голосов
/ 24 февраля 2020

Спасибо @Джин Брукстра! Предложение здесь помогло в решении вопроса { ссылка }.

SELECT ?word ?poslexinfo ?def (GROUP_CONCAT(?syn ; separator="||") AS ?syns) (GROUP_CONCAT(?ant ; separator="||") AS ?ants)
                WHERE {
                    ?f dbnary:describes ?lf.
                    ?lf rdf:type ontolex:LexicalEntry .
                    ?lf lime:language "de" .
                    ?lf ontolex:canonicalForm ?wo .
                    ?wo ontolex:writtenRep ?word .
                    OPTIONAL {?lf lexinfo:partOfSpeech ?poslexinfo} .
                    OPTIONAL {?lf dbnary:partOfSpeech ?posdbnary} .
                    ?lf ontolex:sense ?os .
                    ?os rdf:type ontolex:LexicalSense .
                    OPTIONAL {?os dbnary:antonym ?ant} .
                    OPTIONAL {?os dbnary:synonym ?syn} .
                    ?os skos:definition ?defl .
                    ?defl rdf:value ?def
                } GROUP BY ?word ?syn ?def ?posdbnary ?poslexinfo LIMIT 20
...