#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}
— это то, что вы хотите?