Sparql как выбрать один результат для запроса другой службы в федеративном поиске

Как я могу выбрать одну из возможных меток rdf для отправки в федеративный поиск?

У меня есть запись rdf, у которой есть несколько ссылок на другие базы данных:

<owl:sameAs rdf:resource="http://cantic.bnc.cat/registres/CUCId/a10035400"/>
<owl:sameAs rdf:resource="http://viaf.org/viaf/61502721"/>
<owl:sameAs rdf:resource="http://dbpedia.org/resource/Delfi_Abella"/>
<owl:sameAs rdf:resource="http://id.loc.gov/authorities/names/nr2005020137"/>
<owl:sameAs rdf:resource="http://d-nb.info/gnd/158288475"/>

Я просто получил ссылку на dbpedia, чтобы спросить в dbpedia некоторую информацию, используя ее.

Я создаю этот федеративный поиск, но он не работает:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
  SERVICE <http://dbpedia.org/sparql>
  {
    ?dbpediaid dbo:birthPlace ?naixement
  }
}

Что я делаю не так?

Если я использую одиночный поиск:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
}

Я получаю autid и ссылку на dbpedia.

autid                                                           dbpediaid
http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts

Как я могу сказать СЕРВИ, просто используйте его.

С Уважением


Обновление (изначально опубликовано как ответ)

Может я плохо задаю вопрос:

Я пытаюсь сделать два разных sparql всего за один. Используя результаты первой части вопроса (применен фильтр), я пытаюсь обратиться в DBPEDIA, чтобы получить нужные мне результаты.

Из первой части без фильтра

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
 }

Я получаю такие результаты:

http://arties.cbuc.cat/openccuc/a10603050/  http://cantic.bnc.cat/registres/CUCId/a10603050
http://arties.cbuc.cat/openccuc/a10603050/  http://viaf.org/viaf/169463957
http://arties.cbuc.cat/openccuc/a10667283/  http://cantic.bnc.cat/registres/CUCId/a10667283
http://arties.cbuc.cat/openccuc/a10667283/  http://viaf.org/viaf/303916880
http://arties.cbuc.cat/openccuc/a10895814/  http://cantic.bnc.cat/registres/CUCId/a10895814
http://arties.cbuc.cat/openccuc/a10895814/  http://viaf.org/viaf/107201286
http://arties.cbuc.cat/openccuc/a10895814/  http://d-nb.info/gnd/140511695
http://arties.cbuc.cat/openccuc/a10895814/  http://id.loc.gov/authorities/names/no2010103795
http://arties.cbuc.cat/openccuc/a10985256/  http://cantic.bnc.cat/registres/CUCId/a10985256
http://arties.cbuc.cat/openccuc/a10985256/  http://viaf.org/viaf/85925873
http://arties.cbuc.cat/openccuc/a10985256/  http://id.loc.gov/authorities/names/no2005021393
http://arties.cbuc.cat/openccuc/a10985256/  http://d-nb.info/gnd/141167203
http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts
http://arties.cbuc.cat/openccuc/a11019682/  http://cantic.bnc.cat/registres/CUCId/a11019682
http://arties.cbuc.cat/openccuc/a11019682/  http://viaf.org/viaf/157747131
http://arties.cbuc.cat/openccuc/a11045553/  http://cantic.bnc.cat/registres/CUCId/a11045553
http://arties.cbuc.cat/openccuc/a11045553/  http://viaf.org/viaf/126161085

Применяю фильтр

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
}

чтобы получить один результат:

http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts

И я хочу отправить его в службу DBPEDIA, но просто отправлю этот URL: http://dbpedia.org/resource/Emma_Roberts

Не все URL-адреса, которые я получил из первой части:

http://cantic.bnc.cat/registres/CUCId/a10603050
http://viaf.org/viaf/169463957
http://cantic.bnc.cat/registres/CUCId/a10667283
http://viaf.org/viaf/303916880
http://cantic.bnc.cat/registres/CUCId/a10895814
http://viaf.org/viaf/107201286
http://d-nb.info/gnd/140511695
http://id.loc.gov/authorities/names/no2010103795
http://cantic.bnc.cat/registres/CUCId/a10985256
http://viaf.org/viaf/85925873
http://id.loc.gov/authorities/names/no2005021393
http://d-nb.info/gnd/141167203
http://dbpedia.org/resource/Emma_Roberts

Поскольку некоторые из них не связаны с Dbpedia, DBPEDIA отправляет мне такую ​​ошибку:

Virtuoso RDFZZ Error DB.DBA.SPARQL_REXEC('http://dbpedia.org/sparql', ...) returned Content-Type 'text/plain' status 'HTTP/1.1 400 Bad Request
'
Virtuoso 37000 Error SP030: SPARQL compiler, line 3: syntax error at '_' before ':'

SPARQL query:
define sql:big-data-const 0  SELECT ?naixement
 WHERE  {  <http://dbpedia.org/resource/Emma_Roberts> <http://dbpedia.org/ontology/birthPlace> ?naixement .
     FILTER (_::default-20-7 =  <http://arties.cbuc.es:8990/CCUCAF>) }

SPARQL query:
define sql:big-data-const 0 
#output-format:text/html
define sql:signal-void-variables 1 define get:soft "soft" define input:default-graph-uri <http://arties.cbuc.es:8990/CCUCAF> PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT ?naixement
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  filter regex( str(?dbpediaid),'dbpedia','i')

  SERVICE <http://dbpedia.org/sparql>
  {
    ?dbpediaid dbo:birthPlace ?naixement
  }

person jordi Pallares    schedule 23.07.2014    source источник


Ответы (1)


ФИЛЬТР регулярного выражения (? dbpediaid, 'dbpedia', 'i'), вероятно, должен завершиться ошибкой, поскольку? dbpediaid не является строкой; но URI. Вместо этого вы должны использовать ФИЛЬТР regex (str (? Dbpediaid), 'dbpedia', 'i'). Однако тот факт, что ваш второй запрос возвращает некоторые результаты, создает впечатление, что URI неявно преобразуется в строку. Однако это может быть расширением конкретной реализации, которую вы используете.

Однако, когда я использую Apache Jena для выполнения следующего запроса, я получаю пустые результаты:

prefix dbpedia: <http://dbpedia.org/resource/>
prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select * where {
  bind( dbpedia:Emma_Roberts as ?dbpediaid )
  filter regex( ?dbpediaid,'dbpedia','i')

  service <http://dbpedia.org/sparql> {
    ?dbpediaid dbpedia-owl:birthPlace ?naixement
  }
}
-------------------------
| dbpediaid | naixement |
=========================
-------------------------

Если я изменю использование str (? Dbpediaid), я получу следующие результаты:

prefix dbpedia: <http://dbpedia.org/resource/>
prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select * where {
  bind( dbpedia:Emma_Roberts as ?dbpediaid )
  filter regex( str(?dbpediaid),'dbpedia','i')

  service <http://dbpedia.org/sparql> {
    ?dbpediaid dbpedia-owl:birthPlace ?naixement
  }
}
--------------------------------------------------------------------------------------
| dbpediaid            | naixement                                                   |
======================================================================================
| dbpedia:Emma_Roberts | <http://dbpedia.org/resource/Rhinebeck_(village),_New_York> |
--------------------------------------------------------------------------------------

Обратите внимание, что это может быть очень дорогостоящим запросом, если механизм запросов сначала выполняет часть службы, поскольку он сначала извлечет все тройки dbpedia-owl: BirthPlace, вернет их обратно. , а затем затем сопоставить с конкретным, который вас интересует. Может быть другое поведение, если вместо использования bind, как я делал выше, значение? Dbpediaid просто берется из некоторых тройных совпадений.

person Joshua Taylor    schedule 23.07.2014
comment
Извините, но, может быть, я плохо объясняю - person jordi Pallares; 24.07.2014
comment
@jordiPallares Вы отправили ответ, который на самом деле не является ответом и должен был быть редактированием вопроса. Думаю, я понимаю, что вы пытаетесь сделать: вы пытаетесь запросить данные из одного места (не DBpedia), а затем используете некоторые из этих значений в качестве параметров в запросе к DBpedia, который выполняется service <http://dbpedia.org/sparql> { … }. Это верно? Затем вы сказали, что поскольку некоторые из них не имеют отношения к Dbpedia, а затем DBPEDIA отправляет мне такую ​​ошибку:…. Сообщение об ошибке не говорит о том, что проблема в том, что URI не связаны с DBpedia, но ... - person Joshua Taylor; 24.07.2014
comment
… Скорее, DBpedia возвращает текст вместо результатов SPARQL. Фактический текст, который он возвращает, - это сообщение об ошибке от DBpedia: Virtuoso 37000 Error SP030: компилятор SPARQL, строка 3: синтаксическая ошибка в '_' перед ':' со ссылкой, я полагаю, на строку запрос: FILTER (_::default-20-7 = <http://arties.cbuc.es:8990/CCUCAF>). Я полагаю, что он жалуется на _::default-20-7, но я не уверен. Если вы получили такое подробное сообщение об ошибке, вам следовало разместить его в исходном вопросе. - person Joshua Taylor; 24.07.2014
comment
Вы действительно получили более подробную ошибку, чем то, что вы указали в исходном вопросе. Вы разместили это в ответе; вот откуда я скопировал! - person Joshua Taylor; 24.07.2014