Запрос к проекту Gutenberg catalog.rdf через SPARQL - PullRequest
5 голосов
/ 25 июля 2010

Мне трудно структурировать запрос SPARQL для каталога Project Gutenberg (доступно по Feten Gutenberg внизу страницы).Я знаю, что это фундаментальный недостаток понимания с моей стороны того, как SparQL / RDF / и т.д.на самом деле работает, связывая его с SQL и т. д. Но я пробовал несколько учебных пособий, и я просто не могу сообразить, как соединить предложение WHERE с многомерным набором данных.

IЯ импортировал catalog.rdf в базу данных TDB (из проекта Jena) и использую инструмент tdbquery для первоначальной настройки моего запроса, прежде чем обернуть его в инструмент командной строки, который позволяет выполнять поиск по автору или названию.

Вот что у меня есть:

$ cat gutenquery.tq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX cc: <http://web.resource.org/cc/>
PREFIX pgterms: <http://www.gutenberg.org/rdfterms/>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>

SELECT ?title ?author
WHERE {
    ?book dc:title ?title  ;
          dc:creator ?author
}
LIMIT 10

$ ./tdbquery --loc=/var/db/gutenberg/ --file=gutenquery.tq
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| title                                                                                               | author                                                       |
======================================================================================================================================================================
| "The Belgian Curtain\nEurope after Communism"^^rdf:XMLLiteral                                       | "Vaknin, Samuel, 1961-"^^rdf:XMLLiteral                      |
| "Fairy Tales; Their Origin and Meaning\nWith Some Account of Dwellers in Fairyland"^^rdf:XMLLiteral | "Bunce, John Thackray, 1828-1899"^^rdf:XMLLiteral            |
| "The World English Bible (WEB): Zephaniah"^^rdf:XMLLiteral                                          | "Anonymous"^^rdf:XMLLiteral                                  |
| "Lectures of Col. R. G. Ingersoll - Latest"^^rdf:XMLLiteral                                         | "Ingersoll, Robert Green, 1833-1899"^^rdf:XMLLiteral         |
| "Selections from Erasmus\nPrincipally from his Epistles"^^rdf:XMLLiteral                            | "Erasmus, Desiderius, 1469-1536"^^rdf:XMLLiteral             |
| "East and West\nPoems"^^rdf:XMLLiteral                                                              | "Harte, Bret, 1836-1902"^^rdf:XMLLiteral                     |
| "The Enormous Room"^^rdf:XMLLiteral                                                                 | "Cummings, E. E. (Edward Estlin), 1894-1962"^^rdf:XMLLiteral |
| "The Enormous Room"^^rdf:XMLLiteral                                                                 | _:b0                                                         |
| "Actes et Paroles, Volume 4\nDepuis l'Exil 1876-1885"^^rdf:XMLLiteral                               | "Hugo, Victor, 1802-1885"^^rdf:XMLLiteral                    |
| "L'ÃŽle Des Pingouins"^^rdf:XMLLiteral                                                               | "France, Anatole, 1844-1924"^^rdf:XMLLiteral                 |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Типичная запись из PG выглядит следующим образом, хотя не все поля присутствуют во всех записях:

<pgterms:etext rdf:ID="etext7250">
  <dc:publisher>&pg;</dc:publisher>
  <dc:title rdf:parseType="Literal">A Connecticut Yankee in King Arthur's Court, Part 9.</dc:title>
  <dc:creator rdf:parseType="Literal">Twain, Mark, 1835-1910</dc:creator>
  <pgterms:friendlytitle rdf:parseType="Literal">A Connecticut Yankee in King Arthur's Court, Part </pgterms:friendlytitle>
  <dc:language><dcterms:ISO639-2><rdf:value>en</rdf:value></dcterms:ISO639-2></dc:language>
  <dc:subject>
    <rdf:Bag>
      <rdf:li><dcterms:LCSH><rdf:value>Americans -- Great Britain -- Fiction</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Arthurian romances -- Adaptations</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Britons -- Fiction</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Fantasy fiction</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Kings and rulers -- Fiction</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Knights and knighthood -- Fiction</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Satire</rdf:value></dcterms:LCSH></rdf:li>
      <rdf:li><dcterms:LCSH><rdf:value>Time travel -- Fiction</rdf:value></dcterms:LCSH></rdf:li>
    </rdf:Bag>
  </dc:subject>
  <dc:subject><dcterms:LCC><rdf:value>PS</rdf:value></dcterms:LCC></dc:subject>
  <dc:created><dcterms:W3CDTF><rdf:value>2004-07-07</rdf:value></dcterms:W3CDTF></dc:created>
  <dc:rights rdf:resource="&lic;" />

В дополнение, например, к dc: author и dc: title, я хотел бы получить значение из атрибута pgterms: etext rdf: ID = "STUFF IN HERE":

<pgterms:etext rdf:ID="etext7250">

Помимо объединения записей в списке в разделе dc: subject и т. Д. По сути, предоставьте всю информацию об этой книге в виде единой связной записи через запрос командной строки.

Итак, мои вопросы:

  1. Как мне комбинироватьЗначение атрибута из pg: eterms rdf: ID с остальной частью запроса?
  2. Как объединить записи из списка dc: subject в одну строку?
  3. Поскольку отображаются не все полядля каждой записи, должен ли я использовать предложение OPTIONAL () для окружения полей, которые не всегда появляются?
  4. Как я могу ограничить свой запрос на основе указанной пользователем строки?Я должен использовать FILTER () для этого?

Большое вам спасибо.Я был в состоянии построить запросы, чтобы получить однослойную информацию, но все, кроме этого, атрибуты и т. Д. Для меня почти непостижимы.Это сильно отличается от стандартного SQL и гораздо более сложный проект, чем я думал вначале.

1 Ответ

10 голосов
/ 26 июля 2010

Как мне объединить значение атрибута из pg: eterms rdf: ID с остаток запроса?

Идентификатор RDF, будет URI книги в вашем КБ. В вашем случае, если вы добавите? Book в ваше предложение, вы вернетесь.

Как мне объединить записи из списка dc: subject в одну строку?

Я не уверен в этом. Вы можете поместить dc: subject в свой запрос и затем выполнить его с вашим клиентом.

Поскольку не все поля отображаются для каждой записи, следует ли мне использовать предложение OPTIONAL () для окружения полей, которые не всегда появляются?

Да

Как я могу ограничить свой запрос на основе указанной пользователем строки? Я должен использовать FILTER () для этого?

Да, конкретно FILTER regex()

...