diff --git a/package-lock.json b/package-lock.json index e3ff8bbe..337cc8bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@babel/core": "^7.16.0", "@babel/preset-env": "^7.16.0", "@babel/register": "^7.16.0", + "@rdfjs/data-model": "^1", "arrayify-stream": "^1.0.0", "browserify": "^17.0.0", "chai": "^4.0.2", @@ -27,6 +28,7 @@ "mocha": "^8.0.0", "nyc": "^14.1.1", "pre-commit": "^1.2.2", + "rdf-isomorphic": "^1.3.1", "rdf-test-suite": "^1.19.2", "streamify-string": "^1.0.1", "uglify-js": "^3.14.3" @@ -1734,6 +1736,18 @@ "dev": true, "optional": true }, + "node_modules/@rdfjs/data-model": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", + "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", + "dev": true, + "dependencies": { + "@rdfjs/types": ">=1.0.1" + }, + "bin": { + "rdfjs-data-model-test": "bin/test.js" + } + }, "node_modules/@rdfjs/types": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.0.1.tgz", @@ -6314,9 +6328,9 @@ } }, "node_modules/rdf-isomorphic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rdf-isomorphic/-/rdf-isomorphic-1.3.0.tgz", - "integrity": "sha512-3BRwUwCNHHR8//bqmVH+knTFVbVfkp7CWyQk7qPHHA8JriXBYxrab21OomjJx/2KF21w8bWz344mgNYEaQABYQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rdf-isomorphic/-/rdf-isomorphic-1.3.1.tgz", + "integrity": "sha512-6uIhsXTVp2AtO6f41PdnRV5xZsa0zVZQDTBdn0br+DZuFf5M/YD+T6m8hKDUnALI6nFL/IujTMLgEs20MlNidQ==", "dev": true, "dependencies": { "@rdfjs/types": "*", @@ -9382,6 +9396,15 @@ "dev": true, "optional": true }, + "@rdfjs/data-model": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", + "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", + "dev": true, + "requires": { + "@rdfjs/types": ">=1.0.1" + } + }, "@rdfjs/types": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.0.1.tgz", @@ -13037,9 +13060,9 @@ } }, "rdf-isomorphic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rdf-isomorphic/-/rdf-isomorphic-1.3.0.tgz", - "integrity": "sha512-3BRwUwCNHHR8//bqmVH+knTFVbVfkp7CWyQk7qPHHA8JriXBYxrab21OomjJx/2KF21w8bWz344mgNYEaQABYQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rdf-isomorphic/-/rdf-isomorphic-1.3.1.tgz", + "integrity": "sha512-6uIhsXTVp2AtO6f41PdnRV5xZsa0zVZQDTBdn0br+DZuFf5M/YD+T6m8hKDUnALI6nFL/IujTMLgEs20MlNidQ==", "dev": true, "requires": { "@rdfjs/types": "*", diff --git a/package.json b/package.json index 50cb7554..155df82e 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@babel/core": "^7.16.0", "@babel/preset-env": "^7.16.0", "@babel/register": "^7.16.0", + "@rdfjs/data-model": "^1", "arrayify-stream": "^1.0.0", "browserify": "^17.0.0", "chai": "^4.0.2", @@ -42,6 +43,7 @@ "mocha": "^8.0.0", "nyc": "^14.1.1", "pre-commit": "^1.2.2", + "rdf-isomorphic": "^1.3.1", "rdf-test-suite": "^1.19.2", "streamify-string": "^1.0.1", "uglify-js": "^3.14.3" diff --git a/src/N3Parser.js b/src/N3Parser.js index 1a7d7449..ea632932 100644 --- a/src/N3Parser.js +++ b/src/N3Parser.js @@ -86,7 +86,7 @@ export default class N3Parser { this._inversePredicate = false; // In N3, blank nodes are scoped to a formula // (using a dot as separator, as a blank node label cannot start with it) - this._prefixes._ = (this._graph ? `${this._graph.id.substr(2)}.` : '.'); + this._prefixes._ = (this._graph ? `${this._graph.value}.` : '.'); // Quantifiers are scoped to a formula this._quantified = Object.create(this._quantified); } diff --git a/test/N3Parser-test.js b/test/N3Parser-test.js index 80cb2466..a08c1327 100644 --- a/test/N3Parser-test.js +++ b/test/N3Parser-test.js @@ -1,4 +1,6 @@ -import { Parser, NamedNode, BlankNode, Quad, termFromId } from '../src/'; +import rdfDataModel from '@rdfjs/data-model'; +import { isomorphic } from 'rdf-isomorphic'; +import { Parser, NamedNode, BlankNode, Quad, termFromId, DataFactory as DF } from '../src/'; const BASE_IRI = 'http://example.org/'; @@ -1872,6 +1874,83 @@ describe('Parser', () => { }); }); + describe('A parser instance with external data factory', () => { + it('should parse', () => { + const parser = new Parser({ + baseIRI: BASE_IRI, + format: 'n3', + factory: rdfDataModel, + }); + const quads = parser.parse(` + @prefix : . + { :weather a :Raining } => { :weather a :Cloudy } . + `); + + quads.length.should.be.gt(0); + + const g1 = DF.blankNode(); + const g2 = DF.blankNode(); + + isomorphic(quads, [ + DF.quad( + DF.namedNode('http://example.com/weather'), + DF.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), + DF.namedNode('http://example.com/Raining'), + g1 + ), + DF.quad( + DF.namedNode('http://example.com/weather'), + DF.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), + DF.namedNode('http://example.com/Cloudy'), + g2 + ), + DF.quad( + g1, + DF.namedNode('http://www.w3.org/2000/10/swap/log#implies'), + g2 + ), + ]).should.be.true; + }); + }); + + describe('A turtle parser instance with external data factory', () => { + it('should parse', () => { + const parser = new Parser({ + baseIRI: BASE_IRI, + format: 'turtle', + factory: rdfDataModel, + }); + const quads = parser.parse(` + @prefix : . + :weather a :Raining . + + :jeswr :knows [ + :name "Thomas" ; + ] . + `); + + const bnode = DF.blankNode(); + + isomorphic(quads, [ + DF.quad( + DF.namedNode('http://example.com/weather'), + DF.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), + DF.namedNode('http://example.com/Raining') + ), + DF.quad( + DF.namedNode('http://example.com/jeswr'), + DF.namedNode('http://example.com/knows'), + bnode + ), + DF.quad( + bnode, + DF.namedNode('http://example.com/name'), + DF.literal('Thomas') + ), + ]).should.be.true; + }); + }); + describe('IRI resolution', () => { describe('RFC3986 normal examples', () => { itShouldResolve('http://a/bb/ccc/d;p?q', 'g:h', 'g:h');