Я прочитал о синтаксисе ДОПОЛНИТЕЛЬНОГО здесь, а также выполнил это слайд-шоу ДОПОЛНИТЕЛЬНО. Я думаю, что моя проблема сводится к тому, что у меня нет правильного синтаксиса для, учитывая базовый набор, левое соединение одного ИЛИ другого поля, в зависимости от того, какое из них существует.
Насколько я понимаю, предложения OPTIONAL выполняются по порядку, поэтому я также пытаюсь воспользоваться этим, чтобы последовательно заполнить переменную? University в порядке моего доверия к полю данных.
Мой пример запроса пытается найти, в каких образовательных учреждениях больше всего выпускников, которых назвали Мисс Америка. (Я выбрал этот вариант, потому что он интересен, но при этом набор довольно невелик, и его достаточно для отладки).
Есть как минимум два поля, которые кажутся подходящими для определения принадлежности выпускников образовательных учреждений: dbpedia-owl:education
и dbpedia2:almaMater
.
Мой первый запрос, просто вытащил dbpedia-owl: education:
SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
?ma dbpedia2:title :Miss_America ;
rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
?ma <http://dbpedia.org/ontology/title> ?title;
rdf:type <http://dbpedia.org/ontology/Person> .
FILTER STRSTARTS(?title, "Miss America") .
}
OPTIONAL {
?ma dbpedia-owl:education ?University
}
OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
Мой второй запрос, просто вытащил dbpedia2: almaMater:
SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
?ma dbpedia2:title :Miss_America ;
rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
?ma <http://dbpedia.org/ontology/title> ?title;
rdf:type <http://dbpedia.org/ontology/Person> .
FILTER STRSTARTS(?title, "Miss America") .
}
OPTIONAL { ?ma dbpedia2:almaMater ?University }
OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
Как видите, мне нужно спросить об обоих способах выражения Alma Mater, потому что они охватывают разные вещи.
Однако обе формы совместного необязательного NESTED (III) и UNION (IV), похоже, оставляют элементы, которые были в (I) или (II). Ни то, ни другое не дает мне ДОПОЛНИТЕЛЬНОГО СОЮЗА из вышеперечисленного, которого я ищу.
Вот ВСТАВЛЕННАЯ форма:
SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
?ma dbpedia2:title :Miss_America ;
rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
?ma <http://dbpedia.org/ontology/title> ?title;
rdf:type <http://dbpedia.org/ontology/Person> .
FILTER STRSTARTS(?title, "Miss America") .
}
OPTIONAL {
?ma dbpedia-owl:education ?University
OPTIONAL { ?ma dbpedia2:almaMater ?University }
}
OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
Вот форма UNION:
SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
?ma dbpedia2:title :Miss_America ;
rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
?ma <http://dbpedia.org/ontology/title> ?title;
rdf:type <http://dbpedia.org/ontology/Person> .
FILTER STRSTARTS(?title, "Miss America") .
}
OPTIONAL {{ ?ma dbpedia-owl:education ?University } UNION
{ ?ma dbpedia2:almaMater ?University } .
}
OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
Анализируя то, что я получаю, когда просто перечисляю имена (I) и (II) без агрегирования, не похоже, что ни одно из них, (III) или (IV) дает мне правильный набор возвращаемых данных, включающий данные из (I) ИЛИ (II) там, где он существует. Я понимаю, что могу выполнять запросы индивидуально, а затем объединять их на языке сценариев или, возможно, назначать их как разные переменные необязательного предложения, но это кажется неуклюжим. (Но, пожалуйста, дайте мне знать, рекомендуется ли это.)
Итак, чтобы быть кратким по вопросу:
- Как сформулировать запрос, который вернет всех кандидатов, получивших имя Мисс Америка, присоединившихся к ЛИБО: almaMater или: education, в зависимости от того, что существует?
Кроме того, я заметил, что последняя мисс Америка, Нина Давулури, не отображается в результатах поиска на конечной точке dbpedia, хотя она находится в поле поиска по адресу List_of_Miss_America_titleholder. Как мне исследовать причину несоответствия между конечными точками wikidata и dbpedia (и как я могу помочь вернуть данные ?!)
dbpedia-owl:education
иdbpedia2:almaMater
? То есть одно имеет приоритет над другим? В противном случае вы можете использовать чередование в пути к свойству:?ma dbpedia-owl:education|dbpedia2:almaMater ?University
. - person Joshua Taylor   schedule 17.04.2014