Запрос к проекту Gutenberg catalog.rdf через rdflib.js - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь интерпретировать файл Project Gutenberg catalog.rdf из браузера, используя rdflib.js. В настоящее время я могу загрузить кэшированную копию каталога, разобрать его и match список книг. Затем я пытаюсь получить все сведения о книге (название, автор, темы и т. Д.)

К сожалению, большинство моих буквальных значений возвращаются как [object NodeList]

Пример книги RDF:

<pgterms:etext rdf:ID="etext27785">
  <dc:publisher>&pg;</dc:publisher>
  <dc:title rdf:parseType="Literal">A Book About Lawyers</dc:title>
  <dc:creator rdf:parseType="Literal">Jeaffreson, John Cordy, 1831-1901</dc:creator>
  <pgterms:friendlytitle rdf:parseType="Literal">A Book About Lawyers by John Cordy Jeaffreson</pgterms:friendlytitle>
  <dc:language><dcterms:ISO639-2><rdf:value>en</rdf:value></dcterms:ISO639-2></dc:language>
  <dc:subject><dcterms:LCSH><rdf:value>Lawyers -- Great Britain -- Anecdotes</rdf:value></dcterms:LCSH></dc:subject>
  <dc:subject><dcterms:LCC><rdf:value>KD</rdf:value></dcterms:LCC></dc:subject>
  <dc:created><dcterms:W3CDTF><rdf:value>2009-01-12</rdf:value></dcterms:W3CDTF></dc:created>
  <pgterms:downloads><xsd:nonNegativeInteger><rdf:value>20</rdf:value></xsd:nonNegativeInteger></pgterms:downloads>
  <dc:rights rdf:resource="&lic;" />
</pgterms:etext>

Пример кода, используемого для разбора:

let store = $rdf.graph();
$rdf.parse(stm,store,baseUrl,'application/rdf+xml');
let books = store.match(undefined, types.RDF('type') , types.PGb('etext')).map(t=>t.subject);
let lib = books.map(b=>{
    let props = store.match(b, null, undefined);
    console.debug("Book: " + schema['_id']);
    props.forEach(a=>{
        console.debug(a);
    });
});

В результате возвращаются все тройки, однако часть object часто является попыткой сериализации NodeList. Например, предикат title:

{
  "subject": {
    "termType": "NamedNode",
    "value": "http://www.gutenberg.org/feeds/catalog.rdf#etext14600"
  },
  "predicate": {
    "termType": "NamedNode",
    "value": "http://purl.org/dc/elements/1.1/title"
  },
  "object": {
    "termType": "Literal",
    "value": "[object NodeList]",
    "datatype": {
        "termType": "NamedNode",
        "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral"
    }
  },
  "why": {
    "termType": "NamedNode",
    "value": "https://example.com/datasets/gutenberg/catalog.rdf.gz"
  }
}

Как можно получить фактическое значение литерального объекта из запроса RDF?

Я также был бы открыт для других библиотек RDF JS или других механизмов запросов (например, SPARQL), если бы это было проще.

1 Ответ

0 голосов
/ 10 ноября 2018

Такое поведение является прямым следствием дефекта в библиотеке.

Узлы RDF + XML с parseType='Literal' всегда приводят к "[ojbect NodeList]" в браузере.

https://github.com/linkeddata/rdflib.js/issues/75

...