我试图将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
直接序列化到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
来完成这项任务。