Преобразование или перевод файла RDF/XML в формат JSON-LD

Я пытаюсь разобрать документ в формате RDF/XML в JSON-LD, чтобы его обрамить. Все используют Node.js и не используют какие-либо API-интерфейсы веб-сервисов (не слишком необычное решение).

Я чувствую, что почти достиг цели, но мой нынешний подход кажется, мягко говоря, неуклюжим. Помещение графика в хранилище rdflib, а затем повторный запрос к нему дает мне странный ответ с некоторыми заголовками и отсутствием реального контекста в графике. Отсюда и материал doc[5]['@graph'] посередине.

var fs = require('fs')
var $rdf = require('rdflib')
var jsonld = require('jsonld')

var path = 'path_to_rdf_file'

const frame = {}

fs.readFile(path, 'utf8', function (err, data) {
    var uri = 'https://some.other.uri'
    var store = $rdf.graph()
    $rdf.parse(data, store, uri, 'application/rdf+xml')
    var a = $rdf.serialize(null, store, uri, 'application/n-quads')
    jsonld.fromRDF(a, { format: 'application/n-quads' }, (err, doc) => {
        jsonld.flatten(doc[5]['@graph'], (err, flattened) => {
            console.log(flattened)
            jsonld.frame(flattened, frame, (err, framed) => {
                resolve(framed)
            })
        })
    })
})

Со всеми пакетами RDF и связанными данными, плавающими вокруг npm, я полагаю, что должно быть более простое решение, которое могло бы привести меня из пункта А в пункт Б.

Как я могу разобрать мой документ RDF/XML в документ JSON-LD без использования rdflib таким образом?


person Fontanka16    schedule 04.01.2019    source источник
comment
что не так с использованием rdflib - я имею в виду, что это API, предназначенный для использования RDF. Как еще вы хотите это сделать? Вам нужно будет реализовать свой собственный синтаксический анализатор для RDF/XML, который является нетривиальным, и сериализатор для проанализированных троек RDF.   -  person UninformedUser    schedule 05.01.2019
comment
Ну, мое главное возражение в этом примере заключается в том, что он возвращает некоторые дополнительные данные при вызове $rdf.serialize. Кроме того, я надеялся, что что-то вроде функции jsonld.fromRDF будет принимать RDF/XML.   -  person Fontanka16    schedule 05.01.2019
comment
Хорошо, я думаю, я понял. Прямо сейчас вы используете rdflib для анализа RDF/XML, затем вам нужно преобразовать его в n-quads, прежде чем вы сможете использовать анализатор RDF из jsonld API.   -  person UninformedUser    schedule 05.01.2019
comment
Я думаю, вы не первый, кто спрашивает об этом: см. github.com/digitalbazaar/jsonld .js/issues/255 — похоже, это будет новая библиотека Javascript RDF.js в будущем, который выравнивает RDF-Ext, N3.js и rdflib.js. Проверьте репозиторий Github. Большинство частей уже есть, по крайней мере, я вижу синтаксический анализатор RDF/XML и сериализатор JsonLD, также известный как Sink.   -  person UninformedUser    schedule 05.01.2019
comment
Спасибо. Я буду следить за этим развитием с большим интересом.   -  person Fontanka16    schedule 05.01.2019


Ответы (1)


Вы можете использовать rdflib для прямой сериализации в application/ld+json (внутренне rdflib использует модуль jsonld).

var fs = require('fs')
var $rdf = require('rdflib')
var jsonld = require('jsonld')

var path = 'path_to_rdf_file'

const frame = {}

const toJSONLD = (data, uri, mimeType) => {
    return new Promise((resolve, reject) => {
        var store = $rdf.graph()
        $rdf.parse(data, store, uri, mimeType)
        $rdf.serialize(null, store, uri, 'application/ld+json', (err, jsonldData) => {
            if (err) return reject(err);
            resolve(JSON.parse(jsonldData))
        })
    })
}

fs.readFile(path, 'utf8', function (err, data) {
    var uri = 'https://some.other.uri'
    toJSONLD(data, uri, 'application/rdf+xml')
        .then((doc) => {
            jsonld.flatten(doc[5]['@graph'], (err, flattened) => {
                console.log(flattened)
                jsonld.frame(flattened, frame, (err, framed) => {
                    resolve(framed)
                })
            })
        })
})

Другой способ — оснастить jsonld пользовательскими парсерами для вашего типа данных, используя jsonld.regiserRDFParser (https://www.npmjs.com/package/jsonld#custom-rdf-parser). Хотя вы, вероятно, использовали бы rdflib и для этой задачи.

person Philipp Gfeller    schedule 25.02.2019