Применение group_concat в запросах wikidata для участников - PullRequest
0 голосов
/ 21 марта 2019

Я только что узнал о group_concat и order by, group by, и теперь я пытаюсь применить их к запросам об убийствах.То есть к этому ниже, чтобы получить всех участников и цели.

SELECT DISTINCT ?incident ?label ?participant ?participantLabel ?target ?targetLabel
WHERE {
?incident wdt:P31 wd:Q132821.
?incident rdfs:label ?label.
optional{?incident wdt:P710 ?participant.}
optional{?incident wdt:P533 ?target. } }

И я попытался применить group_concat и group by, order by.(Ничего не делал на target ниже, потому что даже это только для участников не работает):

SELECT DISTINCT ?incident ?label ?target ?targetLabel (group_concat(?participantLabel; separator=";") as ?participant)

WHERE {
?incident wdt:P31 wd:Q132821.
?incident rdfs:label ?label.
optional{?incident wdt:P710 ?participant.}
optional{?incident wdt:P533 ?target. }}
GROUP BY ?participant ?participantLabel
ORDER BY ?participantLabel

И мне сказали Запрос искажен: Плохая совокупность .

Это потому, что не во всех случаях есть участники?Как я могу заняться этим?

1 Ответ

1 голос
/ 21 марта 2019

Вам необходимо прочитать полное сообщение об ошибке из Викиданных.Ключевые строки здесь -

java.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: Bad aggregate
...
Caused by: org.openrdf.query.MalformedQueryException: Bad aggregate
...
Caused by: com.bigdata.rdf.sail.sparql.ast.VisitorException: Bad aggregate
...
Caused by: java.lang.IllegalArgumentException: Non-aggregate variable in select expression: incident

По сути, все неагрегированные переменные в вашем SELECT также должны быть в вашем GROUP BY.С некоторыми другими изменениями, которые, я думаю, принесут вам пользу, ваш запрос станет примерно таким:

SELECT DISTINCT ?incident 
                ?incidentLabel 
                ?target
                ?targetLabel
                ( GROUP_CONCAT ( DISTINCT ?participantLabel; separator="; " ) AS ?participants )
WHERE
  {
               ?incident     wdt:P31     wd:Q132821 .
               ?incident     rdfs:label  ?incidentLabel .
               FILTER ( LANGMATCHES ( LANG ( ?incidentLabel ), "en" ) ) 
    OPTIONAL { ?incident     wdt:P710    ?participant .
               ?participant  rdfs:label  ?participantLabel 
               FILTER ( LANGMATCHES ( LANG ( ?participantLabel ), "en" ) ) 
             }
    OPTIONAL { ?incident     wdt:P533    ?target . 
               ?target       rdfs:label  ?targetLabel 
               FILTER ( LANGMATCHES ( LANG ( ?targetLabel ), "en" ) ) 
             }
  }
GROUP BY ?incident ?incidentLabel ?target ?targetLabel
ORDER BY ?incidentLabel ?targetLabel 

Я не могу объяснить дублирующиеся строки, которые появляются в наборе результатов (прокрутите вниз до "1991 бомбардировка Вика"),Они должны были быть устранены одним или обоими SELECT DISTINCT и GROUP BY.

...