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');