From 17052b62209a92112d21a01dd8d2cd2f5fde16a3 Mon Sep 17 00:00:00 2001 From: bourgeoa Date: Fri, 2 Dec 2022 17:04:53 +0100 Subject: [PATCH] jsonld BlankNodes --- src/jsonldparser.js | 15 +++++++-- tests/unit/parse-test.js | 67 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/jsonldparser.js b/src/jsonldparser.js index 5fbc9503d..79eb5e928 100644 --- a/src/jsonldparser.js +++ b/src/jsonldparser.js @@ -22,7 +22,7 @@ export function jsonldObjectToTerm (kb, obj) { } if (Object.prototype.hasOwnProperty.call(obj, '@id')) { - return kb.rdfFactory.namedNode(obj['@id']) + return nodeType(kb, obj) } if (Object.prototype.hasOwnProperty.call(obj, '@language')) { @@ -44,7 +44,7 @@ export function jsonldObjectToTerm (kb, obj) { * Adds the statements in a json-ld list object to {kb}. */ function listToStatements (kb, obj) { - const listId = obj['@id'] ? kb.rdfFactory.namedNode(obj['@id']) : kb.rdfFactory.blankNode() + const listId = obj['@id'] ? nodeType(kb, obj) : kb.rdfFactory.blankNode() const items = obj['@list'].map((listItem => jsonldObjectToTerm(kb, listItem))) const statements = arrayToStatements(kb.rdfFactory, listId, items) @@ -82,10 +82,19 @@ export default function jsonldParser (str, kb, base, callback) { .catch(callback) } +function nodeType (kb, obj) { + if (obj['@id'].startsWith('_:')) { + // This object is a Blank Node.. pass the id without the preceding _: + return kb.rdfFactory.blankNode(obj['@id'].substring(2)); + } else { + // This object is a Named Node + return kb.rdfFactory.namedNode(obj['@id']); + } +} function processResource(kb, base, flatResource) { const id = flatResource['@id'] - ? kb.rdfFactory.namedNode(flatResource['@id']) + ? nodeType(kb, flatResource) : kb.rdfFactory.blankNode() for (const property of Object.keys(flatResource)) { diff --git a/tests/unit/parse-test.js b/tests/unit/parse-test.js index d6ff5e119..d8465cb13 100644 --- a/tests/unit/parse-test.js +++ b/tests/unit/parse-test.js @@ -5,6 +5,7 @@ import parse from '../../src/parse' import CanonicalDataFactory from '../../src/factories/canonical-data-factory' import defaultXSD from '../../src/xsd' import DataFactory from '../../src/factories/rdflib-data-factory' +import serialize from '../../src/serialize' describe('Parse', () => { describe('ttl', () => { @@ -231,7 +232,71 @@ describe('Parse', () => { }) }) - describe('with a @type node', () => { + describe('jsonld with blanknodes', () => { + let store + before(done => { + const base = 'https://www.example.org/abc/def' + const mimeType = 'application/ld+json' + const content = ` + { + "@context": { + "ex": "http://example.com#" + }, + "@id": "ex:myid", + "ex:prop1": { + "ex:prop2": { + "ex:prop3": "value" + } + } + }` + store = DataFactory.graph() + parse(content, store, base, mimeType, done) + }) + + it('store contains 3 statements', () => { + expect(store.statements).to.have.length(3) + // console.log(serialize(null, store, null, 'text/turtle')) + expect(serialize(null, store, null, 'text/turtle')).to.eql(`@prefix ex: . + +ex:myid ex:prop1 [ ex:prop2 [ ex:prop3 "value" ] ]. + +`) + const nt = store.toNT() + expect(nt).to.include(' _:b0 .') + expect(nt).to.include('_:b0 _:b1 .') + expect(nt).to.include('_:b1 "value" .') + }); + }) + + describe('ttl with blanknodes', () => { + let store + before(done => { + const base = 'https://www.example.org/abc/def' + const mimeType = 'text/turtle' + const content = ` + @prefix : <#>. + @prefix ex: . + + ex:myid ex:prop1 _:b0. + _:b0 ex:prop2 _:b1. + _:b1 ex:prop3 "value". + ` + store = DataFactory.graph() + parse(content, store, base, mimeType, done) + }) + + it('store contains 3 statements', () => { + expect(store.statements).to.have.length(3) + // console.log(serialize(null, store, null, 'application/json+ld')) + expect(serialize(null, store, null, 'text/turtle')).to.eql(`@prefix ex: . + +ex:myid ex:prop1 [ ex:prop2 [ ex:prop3 "value" ] ]. + +`) + }); + }) + + describe('with a @type node', () => { const content = ` { "@id": "jane",