Lightning fast, asynchronous, streaming Turtle / N3 / RDF
Notation3 or N3 is a superset of RDF, the Semantic Web language.
This library will provide a high-performance N3 store, parser, and generator (when finished).
Currently implemented:
Parsing Turtle from a string or stream
The node-n3 library can parse Turtle strings.
var parser = new n3.Parser();
parser.parse('@prefix c: <http://example.org/cartoons#>.\n' +
'c:Tom a c:Cat.\n' +
'c:Jerry a c:Mouse;\n' +
' c:smarterThan c:Tom.',
function (error, triple) {
if (triple)
console.log(triple.subject, triple.predicate, triple.object, '.');
else
console.log("# That's all, folks!")
});
Additionally, it can parse streams as they grow, returning triples as soon as they're ready.
This behavior sets node-n3 apart from most other Turtle libraries.
var parser = new n3.Parser(),
turtleStream = fs.createReadStream('cartoons.ttl');
parser.parse(turtleStream, console.log);
Transforming a stream into triples
node-n3 offers a Transform interface to the Node Stream system,
so you can transform Turtle streams and pipe them to anywhere.
This solution is ideal if your consumer is slower,
as it avoids backpressure from the parser.
var transform = new n3.Transform(),
turtleStream = fs.createReadStream('cartoons.ttl');
turtleStream.pipe(transform);
transform.pipe(new SlowWriter());
function SlowWriter() {
var writer = new Writable({ objectMode: true });
writer._write = function (triple, encoding, done) {
console.log(triple);
setTimeout(done, 1000);
};
return writer;
}
Storing and finding items
In this example below, we create a new store and add the triples :Pluto a :Dog.
and :Mickey a :Mouse
.
Then, we find a triple with :Mickey
as subject.
var n3 = require('n3');
var store = new n3.Store();
store.add(':Pluto', 'a', ':Dog');
store.add(':Mickey', 'a', ':Mouse');
var mickey = store.find(':Mickey', null, null)[0];
console.log(mickey.subject, mickey.predicate, mickey.object, '.');
Representing URIs and literals
node-n3 has a special syntax to represent URIs and literals,
making code efficient to write and execute.
As URIs are most common, they are represented as simple strings:
var N3Util = require('n3').Util;
N3Util.isUri('http://example.org/cartoons#Mickey');
Literals are represented as double quoted strings:
N3Util.isLiteral('"Mickey Mouse"');
N3Util.isLiteral('"Mickey Mouse"@en');
N3Util.isLiteral('"3"^^<http://www.w3.org/2001/XMLSchema#integer>');
N3Util.isLiteral('"http://example.org/"');
Note the difference between 'http://example.org/'
(URI) and '"http://example.org/"'
(literal).
Also note that the double quoted literals are not raw Turtle syntax:
N3Util.isLiteral('"This word is "quoted"!"');
The above string represents the string This word is "quoted"!,
even though the correct Turtle syntax for that is "This word is \"quoted\"!"
node-n3 thus always parses literals, but adds quotes to differentiate from URIs:
new n3.Parser().parse('<a> <b> "This word is \\"quoted\\"!".', console.log);
For convenience, N3Util
can also be loaded globally:
require('n3').Util(global);
isUri('http://example.org/cartoons#Mickey');
isLiteral('"Mickey Mouse"');
If desired, the methods can even be added directly on all strings:
require('n3').Util(String, true);
'http://example.org/cartoons#Mickey'.isUri();
'"Mickey Mouse"'.isLiteral();
Installation
You can install the n3 library as an npm package.
$ npm install n3
Learn more
The Bringing reasoning to the Web page explains the origins of this project and provides pointers to related resources.