ДОПОЛНИТЕЛЬНО не работает с запросом SPARQL в локальном редакторе YASGUI
У меня снова возникли проблемы с SPARQL. Прежде всего, немного справочной информации: я использовал службу запросов Wikidata для получения данных из Wikidata. Поскольку конечная точка Wikidata SPARQL ограничена, и для больших задач возникают тайм-ауты, я решил:
- Разделите запросы на несколько меньших
- Загрузите их как.csv
- Конвертируйте их в.nt N-Triples
- Импортируйте их в Cliopatra (который использует SWI-Prolog)
- Используйте встроенный YASGUI SPARQL Editor для локального запроса данных.
На данный момент запрос работает в службе запросов Wikidata. Тем не менее, локально я не получаю опциональную функцию для работы.
Мой код Wikidata выглядит следующим образом (это меньший выбор всех данных, которые я хочу получить):
SELECT ?q ?GTAA_ID ?pseudonym ?date_of_death
(group_concat(DISTINCT ?occupationLabel;separator=", ") as ?Occupations )
WHERE{
?q wdt:P1741 ?GTAA_ID.
OPTIONAL {?q wdt:P742 ?pseudonym.}
OPTIONAL {?q wdt:P570 ?date_of_death.}
OPTIONAL {?q wdt:P106 ?occupation.}
SERVICE wikibase:label { bd:serviceParam wikibase:language "nl".
?occupation rdfs:label ?occupationLabel.}
}
GROUP BY ?q ?GTAA_ID ?pseudonym ?date_of_death
и это правильно восстанавливает:
q | GTAA_ID | pseudonym | date_of_death | occupation
Q3295087 | 102376 | | 2000-11-05 | acteur
Q2800419 | 89301 | | | politicus, staatsman
and so on
Дело в том, что он позволяет мне выбирать все результаты, которые имеют идентификатор Wikidata и идентификатор GTAA и соответствующий псевдоним, date_of_death и профессии (если доступны). Кроме того, если у человека несколько профессий, он разделяет их на "," и помещает их в один ряд.
Однако, как указано выше, я загрузил файлы, чтобы иметь возможность запрашивать их локально. Для этого я преобразовал файлы.csv в.nt со следующим форматом:
<?s> <?p> "?o"
где объект является строкой. Обратите внимание, что в следующих примерах? P правильно используется, как я конвертировал в.nt. (Поэтому используется PREFIX ps) Загрузил их в Cliopatria и использовал следующий код в редакторе YASGUI:
PREFIX ps: <http://www.wikidata.org/prop/statement/>
SELECT ?q ?GTAA_ID ?date_of_death ?pseudonym
(group_concat(DISTINCT ?occupation;separator=", ") as ?occupations )
WHERE{
?q ps:P1741 ?GTAA_ID.
OPTIONAL{?q ps:P742 ?pseudonym.}
OPTIONAL{?q ps:P106 ?occupation.}
OPTIONAL{?q ps:P570 ?date_of_death.}
}
GROUP BY ?q ?GTAA_ID ?date_of_death ?pseudonym
Однако в этом запросе "псевдоним" занятие и "date_of_death" являются необязательными, но занятия не объединяются в одну строку. Запрос 1
Если я заменю функцию GROUP BY на
GROUP BY ?q ?GTAA_ID
он вообще не отображает псевдоним и date_of_death, но объединяет занятие. Запрос 2
Если я заменю функцию GROUP BY на
GROUP BY ?q ?GTAA_ID ?date_of_death
он объединяет только "занятие" для "q", имеющего "date_of_death". Те, у кого нет? Date_of_death, не объединяются в 1 строку. Кроме того, он вообще не отображает псевдоним. Запрос 3
Я подозреваю, что это связано с функцией GROUP BY в сочетании с функцией group_concat. Однако я не понимаю, почему это работает в службе запросов Wikidata, но не на моем локальном хосте. Локально используемый файл.nt доступен здесь
Спасибо заранее!