/
TurtleFragmentWriter.js
106 lines (93 loc) · 4.77 KB
/
TurtleFragmentWriter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*! @license ©2013 Ruben Verborgh - Multimedia Lab / iMinds / Ghent University */
/** A TurtleFragmentWriter represents a basic Linked Data Fragment as Turtle. */
var N3Writer = require('n3').Writer,
N3Util = require('n3').Util,
UriTemplate = require('uritemplate');
var dcterms = 'http://purl.org/dc/terms/',
rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
rdfs = 'http://www.w3.org/2000/01/rdf-schema#',
rdfForms = 'http://www.markbaker.ca/2003/rdfforms/',
xsd = 'http://www.w3.org/2001/XMLSchema',
voID = 'http://rdfs.org/ns/void#';
// Creates a new TurtleFragmentWriter
function TurtleFragmentWriter(datasetName, dataset, fragment, pattern) {
this._datasetName = datasetName;
this._dataset = dataset;
this._fragment = fragment;
this._pattern = pattern;
}
TurtleFragmentWriter.prototype = {
// Write the representation of the fragment results to the output stream
write: function (outputStream, results) {
var writer = new N3Writer(outputStream),
addTriple = function (s, p, o) { writer.addTriple({ subject: s, predicate: p, object: o }); },
// Dataset, fragment and pattern metadata
datasetName = this._datasetName, dataset = this._dataset,
fragment = this._fragment, pattern = this._pattern,
subject = pattern.subject, predicate = pattern.predicate, object = pattern.object,
subjectURI = subject && ('<' + subject + '>'),
predicateURI = predicate && ('<' + predicate + '>'),
objectIsLiteral = N3Util.isLiteral(object),
objectURI = object && (objectIsLiteral ? object : '<' + object + '>'),
patternString = ['{', subjectURI || '?s', predicateURI || '?p', objectURI || '?o', '}'].join(' '),
// Controls metadata
formTemplateUri = dataset + '{?subject,predicate,object}',
formTemplate = UriTemplate.parse(formTemplateUri);
// Add metadata about the dataset
addTriple(dataset, voID + 'subset', fragment);
addTriple(dataset, voID + 'uriLookupEndpoint', '"' + formTemplateUri + '"');
// Add query form
addTriple(dataset, rdf + 'type', rdfForms + 'indexable');
addTriple(dataset, rdfForms + 'indexedBy', dataset + '#Subject');
addTriple(dataset, rdfForms + 'indexedBy', dataset + '#Predicate');
addTriple(dataset, rdfForms + 'indexedBy', dataset + '#Object');
addTriple(dataset + '#Subject', rdfForms + 'shortName', '"subject"');
addTriple(dataset + '#Subject', rdf + 'predicate', rdf + 'subject');
addTriple(dataset + '#Predicate', rdfForms + 'shortName', '"predicate"');
addTriple(dataset + '#Predicate', rdf + 'predicate', rdf + 'predicate');
addTriple(dataset + '#Object', rdfForms + 'shortName', '"object"');
addTriple(dataset + '#Object', rdf + 'predicate', rdf + 'object');
// Add fragment metadata
addTriple(fragment, dcterms + 'title', '"A \'' + datasetName + '\' Linked Data Fragment"@en');
addTriple(fragment, dcterms + 'description',
'"Basic Linked Data Fragment of the \'' + datasetName + '\' dataset ' +
'containing triples matching the pattern ' + patternString + '."@en');
addTriple(fragment, dcterms + 'source', dataset);
addTriple(fragment, voID + 'triples', '"' + results.total + '"^^<' + xsd + 'integer>');
// Add subject metadata
if (subject) {
addTriple(fragment, dcterms + 'subject', subject);
if (predicate || object)
addTriple(subject, rdfs + 'seeAlso', formTemplate.expand({ subject: subjectURI }));
addTriple(subject, rdfs + 'seeAlso', formTemplate.expand({ object: subjectURI }));
}
// Add predicate metadata
if (predicate) {
if (!subject && !object) {
addTriple(dataset, voID + 'propertyPartition', fragment);
addTriple(fragment, voID + 'property', predicate);
}
if (subject || object)
addTriple(predicate, rdfs + 'seeAlso', formTemplate.expand({ predicate: predicateURI }));
addTriple(predicate, rdfs + 'seeAlso', formTemplate.expand({ subject: predicateURI }));
addTriple(predicate, rdfs + 'seeAlso', formTemplate.expand({ object: predicateURI }));
}
// Add object metadata
if (object) {
addTriple(fragment, dcterms + 'subject', object);
if (!subject && predicate === rdf + 'type') {
addTriple(dataset, voID + 'classPartition', fragment);
addTriple(fragment, voID + 'class', object);
}
if (!objectIsLiteral) {
if (subject || predicate)
addTriple(object, rdfs + 'seeAlso', formTemplate.expand({ object: objectURI }));
addTriple(object, rdfs + 'seeAlso', formTemplate.expand({ subject: objectURI }));
}
}
// Write all result data
results.triples.forEach(writer.addTriple.bind(writer));
writer.end();
},
};
module.exports = TurtleFragmentWriter;