SPARQL / DBpedia: извлекать объект через свойства, не зная URI страницы объекта

#sparql #dbpedia

#sparql #dbpedia

Вопрос:

Я пытаюсь вернуть свойство из объекта, описывающего компанию / акции в DBpedia, учитывая уникальную комбинацию других свойств, которым принадлежит этот объект.

Например, учитывая строки NASDAQ и AAPL , я хочу иметь возможность находить http://dbpedia.org/page/Apple_Inc . страница без явного указания URI.

Я знаю, что эта страница содержит свойства

  • dbp:symbol : AAPL

  • dbp:tradedAs : dbr:NASDAQ-100

Как бы я использовал SPARQL для прямого dbp:symbol поиска AAPL и поиска dbp:tradedAs частичного совпадения на NASDAQ , чтобы вернуть наиболее вероятный результат, если таковой существует.

Я также должен добавить, что свойство, которое я хочу вернуть с этой страницы, если есть совпадение, dbo:abstract соответствует большому текстовому описанию компании / акций, которое я хотел бы использовать для синтаксического анализа.

РЕДАКТИРОВАТЬ: мне удалось выполнить следующее:

 SELECT *
WHERE {
   ?s1 dbpedia2:symbol ?o1 .
   ?s1 dbpedia2:tradedAs ?o2 .
   ?o1 bif:contains  '"AAPL"'  .
}
  

который возвращает записи

 s1  o1  o2
:Apple_Inc. [http]  "AAPL"^^rdf:langString  :Samp;P_500 
:Apple_Inc.    [http]   "AAPL"^^rdf:langString  :Dow_Jones_Industrial_Average    
:Apple_Inc. [http]  "AAPL"^^rdf:langString  :NASDAQ-100
  

Я пытался добавить ?o2 bif:contains 'NASDAQ' , но, похоже, это не сработало.

Комментарии:

1. вы понимаете, почему ?o2 bif:contains 'NASDAQ' ? bif:contains это полнотекстовый индекс только для литералов, но значениями для dbp:tradedAs в вашем случае являются URI

Ответ №1:

Мне удалось это решить:

 PREFIX dbpedia2: <http://dbpedia.org/property/> 
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT *
WHERE {
   ?s1 dbpedia2:symbol ?symbol .
   ?s1 dbpedia2:tradedAs ?exchange .
   ?s1 dbo:abstract ?abstract .
   ?symbol bif:contains  '"AAPL"'  .
   FILTER(lang(?abstract) = "en").
   FILTER(regex(str(?exchange), "NASDAQ" ) )
}
  

который возвращает

 s1  symbol  exchange    abstract
:Apple_Inc. "AAPL"^^rdf:langString  :NASDAQ-100 "Apple Inc. is an American multinational technology company headquartered in Cupertino, California...
  

Просто отметим, специально для этой записи, rdfs:comment это более полезно для краткого обзора компании.

Комментарии:

1. rdfs:comment всегда совпадает с dbo:abstract или является его более короткой частью. Альтернативой вашему regex сканированию по URI могло бы быть использование bif:contains фильтра на английской метке ?exchange узла. Т.е. ?exchange rdfs:label ?exchangeLabel . ?exchangeLabel bif:contains '"NASDAQ"' FILTER(lang(?abstract) = "en" amp;amp; lang(?exchangeLabel) = "en").

2. @AKSW Отлично, большое спасибо. Из любопытства я нахожу, что проще находить элементы по акциям / обмену через Викиданные. Есть ли способ устранить пробел и найти элемент через Wikidata, а затем получить его rdfs:comment из DBpedia? Я знаю, что это может быть слишком большой запрос комментариев, может превратиться в собственный вопрос.

3. Из викиданных или из DBpedia в качестве отправной точки? Если вы в состоянии идентифицировать объект в Викиданных, вы можете использовать объединенный запрос SPARQL, подобный этому: SELECT ?entity ?comment WHERE { BIND(<http://www.wikidata.org/entity/Q312> as ?entity) SERVICE <http://dbpedia.org/sparql> { ?s owl:sameAs ?entity . ?s rdfs:comment ?comment filter(langmatches(lang(?comment),"en")) } } и использовать owl:sameAs ссылки в DBpedia. Обратите внимание, здесь я просто «жестко запрограммировал» ту часть в Викиданных, где вы должны идентифицировать объект через свойства exchange в Викиданных

4. @AKSW Я действительно хотел спросить, есть ли более эффективный способ возврата owl:sameAs объектов, скажем, если бы у меня был список ссылок на викиданные и мне нужен эквивалент комментария DBpedia; что-то вроде выборки их строка за строкой?

5. что вы подразумеваете под «более эффективным»? Я также не знаю, что вы подразумеваете под «списком». В SPARQL вы можете использовать VALUES для предоставления встроенных данных аналогично: VALUES ?p {:e1 :e2 :e3 ... :en} — это то, что вы хотите?