Правильный синтаксис для двух / параллельных / левых объединений с одним и тем же именем в SPARQL (возможно, с использованием ДОПОЛНИТЕЛЬНО)

Я прочитал о синтаксисе ДОПОЛНИТЕЛЬНОГО здесь, а также выполнил это слайд-шоу ДОПОЛНИТЕЛЬНО. Я думаю, что моя проблема сводится к тому, что у меня нет правильного синтаксиса для, учитывая базовый набор, левое соединение одного ИЛИ другого поля, в зависимости от того, какое из них существует.

Насколько я понимаю, предложения 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)

РЕЗУЛЬТАТЫ SPARQL

Мой второй запрос, просто вытащил 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)

РЕЗУЛЬТАТЫ SPARQL

Как видите, мне нужно спросить об обоих способах выражения 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)

РЕЗУЛЬТАТЫ SPARQL

Вот форма 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)

РЕЗУЛЬТАТЫ SPARQL

Анализируя то, что я получаю, когда просто перечисляю имена (I) и (II) без агрегирования, не похоже, что ни одно из них, (III) или (IV) дает мне правильный набор возвращаемых данных, включающий данные из (I) ИЛИ (II) там, где он существует. Я понимаю, что могу выполнять запросы индивидуально, а затем объединять их на языке сценариев или, возможно, назначать их как разные переменные необязательного предложения, но это кажется неуклюжим. (Но, пожалуйста, дайте мне знать, рекомендуется ли это.)

Итак, чтобы быть кратким по вопросу:

  • Как сформулировать запрос, который вернет всех кандидатов, получивших имя Мисс Америка, присоединившихся к ЛИБО: almaMater или: education, в зависимости от того, что существует?

Кроме того, я заметил, что последняя мисс Америка, Нина Давулури, не отображается в результатах поиска на конечной точке dbpedia, хотя она находится в поле поиска по адресу List_of_Miss_America_titleholder. Как мне исследовать причину несоответствия между конечными точками wikidata и dbpedia (и как я могу помочь вернуть данные ?!)


person Mittenchops    schedule 16.04.2014    source источник
comment
Есть ли у вас предпочтения между двумя свойствами dbpedia-owl:education и dbpedia2:almaMater? То есть одно имеет приоритет над другим? В противном случае вы можете использовать чередование в пути к свойству: ?ma dbpedia-owl:education|dbpedia2:almaMater ?University.   -  person Joshua Taylor    schedule 17.04.2014
comment
Думаю, я бы предпочел, чтобы они были каскадными, так что, если они не согласятся, я предпочту образование almaMater, но очень интересно узнать о пути   -  person Mittenchops    schedule 17.04.2014
comment
Хорошо, потребовалась доработка, но теперь у нас есть правильное каскадирование.   -  person Joshua Taylor    schedule 17.04.2014


Ответы (1)


Во-первых, гораздо проще помочь, если вы предоставите полные запросы SPARQL, включая префиксы (особенно если вы используете некоторые нестандартные), или если вы используете те же префиксы, что и пользовательский интерфейс общедоступной конечной точки (см. http://dbpedia.org/sparql?nsdecl). Не сразу понятно, что такое dbpedia2 и т. Д. (Хотя теперь я понимаю, что dbpedia2 определен в проводнике SNORQL, с которым вы связались).

Также обратите внимание, что хотя Virtuoso может принимать ваши запросы, на самом деле не все они являются законным SPARQL. Например, если вы возьмете свой первый запрос и перейдете на http://sparql.org/validate/query, вы увидите, что синтаксис переменной проекции недопустим. Это должно быть

select (count(distinct(?ma)) as ?people) ?University where

где … as ?people заключен в круглые скобки, а между переменными нет запятой. (Это не проблема, но вы также можете использовать count(distinct ?ma) и сохранить две круглые скобки.)

Далее, поскольку данные DBpedia основаны на Википедии, а это означает, что иногда они могут быть немного перепутаны, всегда полезно немного просмотреть данные, чтобы найти лучший способ идентифицировать вещи. В этом случае при просмотре http://dbpedia.org/page/Angela_Perez_Baraquio оказывается, что Хороший способ определить победителей конкурса «Мисс Америка» - это поиск людей, у которых есть dcterms:subject category:Miss_America_winners. Таким образом, у нас есть такой запрос:

select ?person where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners
}

результаты SPARQL

Не все из них будут иметь чистую информацию об образовании / альма-матер / и т. Д., Но вы можете использовать путь к свойству чередования с |, чтобы использовать любое количество свойств. Тогда вы получите такой запрос (для трех свойств):

select ?education (count(distinct ?person) as ?numWinners) where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners .
  optional { 
    ?person dbpprop:education|dbpprop:almaMater|dbpedia-owl:almaMater ?education 
  }
}
group by ?education

результаты SPARQL

Это не особо поучительно; Самая большая общность - это люди, не имеющие ценности для этих свойств. Для других значений существует сочетание строк и ресурсов. По крайней мере, их два для Университета Миссисипи.

Выбор значений свойств, среди которых есть предпочтение, на самом деле не совсем тривиально в SPARQL, и это обсуждалось в этом вопросе answers.semanticweb.com: Шаблоны предпочтений для SPARQL (1.1). Есть несколько способов сделать это, но я думаю, что самый простой из них - сопоставить все свойства в дополнительных блоках, а затем coalesce их в один:

select ?person ?education where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners .
  optional { ?person dbpedia-owl:almaMater ?ed1 }
  optional { ?person dbpprop:almaMater ?ed2 }
  optional { ?person dbpprop:education ?ed3 }
  bind( coalesce(?ed1,?ed2,?ed3) as ?education )
}

результаты SPARQL

Для людей, у которых есть значения для более чем одного из этих свойств, мы получаем предпочтительное свойство. Например, для http://dbpedia.org/resource/Angela_Perez_Baraquio мы получаем dbpedia-owl:almaMater, http://dbpedia.org/resource/University_of_Hawaii. В случаях, когда есть несколько значений для лучшего свойства, мы все равно получаем их все. Например, для http://dbpedia.org/resource/Kylene_Barker мы получаем оба http://dbpedia.org/resource/Virginia_Tech и http://dbpedia.org/resource/Carroll_County_High_School_%28Hillsville,_Virginia%29.

person Joshua Taylor    schedule 17.04.2014