【问题标题】:Convert or translate a RDF/XML file to JSON-LD format将 RDF/XML 文件转换或翻译成 JSON-LD 格式
【发布时间】:2019-01-04 17:46:34
【问题描述】:

我正在尝试将 RDF/XML 格式的文档解析为 JSON-LD 以便对其进行构图。全部使用 Node.js,不使用任何 Web 服务 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 周围浮动,我认为肯定有一个更简单的解决方案可以让我从 A 转到 B。

如何在不使用 rdflib 的情况下将我的 RDF/XML 文档解析为 JSON-LD 文档?

【问题讨论】:

  • 使用 rdflib 有什么问题 - 我的意思是,它是为使用 RDF 而设计的 API。你还想怎么做?您必须为 RDF/XML 实现自己的解析器,这很重要,并为解析的 RDF 三元组实现序列化器。
  • 好吧,我在这个例子中的主要反对意见是它在调用 $rdf.serialize 时返回了一些额外的数据。另外,我希望像 jsonld.fromRDF 函数这样的东西可以接受 RDF/XML
  • 好的,我想我明白了。现在,您使用rdflib 解析RDF/XML,然后您必须将其转换为n-quads,然后才能使用来自jsonld API 的RDF 解析器
  • 我猜你不是第一个问这个问题的人:见github.com/digitalbazaar/jsonld.js/issues/255 - 看起来未来将是一个新的Javascript库RDF.js,它与RDF-Ext、N3.js和rdflib.js 。检查 Github 存储库。大多数部分已经存在,至少我可以看到 RDF/XML 解析器和 JsonLD 序列化器,即 Sink
  • 谢谢。我将怀着极大的兴趣关注这一发展。

标签: node.js rdf json-ld format-conversion rdf-xml


【解决方案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.regiserRDFParser (https://www.npmjs.com/package/jsonld#custom-rdf-parser) 为您的数据类型配备自定义解析器jsonld。尽管您也可能会使用 rdflib 来完成此任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2019-11-07
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多