rdf
Version:
RDF datatype integration, RDF Interfaces API, and utility functions
611 lines (605 loc) • 32.3 kB
JavaScript
var assert = require('assert');
var rdf = require('..');
function rdfns(v){ return "http://www.w3.org/1999/02/22-rdf-syntax-ns#".concat(v); }
function rdfsns(v){ return "http://www.w3.org/2000/01/rdf-schema#".concat(v); }
function triple(s, p, o){
return rdf.environment.createTriple(
typeof s=='string' ? rdf.environment.createNamedNode(s) : s ,
typeof p=='string' ? rdf.environment.createNamedNode(p) : p ,
typeof o=='string' ? rdf.environment.createNamedNode(o) : o
);
}
function GenerateGraphTest(Graph){
describe('methods exist', function(){
var t = new Graph;
it('add exists', function(){ assert.equal(typeof t.add, 'function'); });
it('remove exists', function(){ assert.equal(typeof t.remove, 'function'); });
it('removeMatches exists', function(){ assert.equal(typeof t.removeMatches, 'function'); });
it('toArray exists', function(){ assert.equal(typeof t.toArray, 'function'); });
it('some exists', function(){ assert.equal(typeof t.some, 'function'); });
it('every exists', function(){ assert.equal(typeof t.every, 'function'); });
it('filter exists', function(){ assert.equal(typeof t.filter, 'function'); });
it('forEach exists', function(){ assert.equal(typeof t.forEach, 'function'); });
it('match exists', function(){ assert.equal(typeof t.match, 'function'); });
it('merge exists', function(){ assert.equal(typeof t.merge, 'function'); });
it('addAll exists', function(){ assert.equal(typeof t.addAll, 'function'); });
//it('actions exists', function(){ assert.ok(Array.isArray(t.actions)); });
//it('addAction exists', function(){ assert.equal(typeof t.addAction, 'function'); });
});
describe(Graph.name+' data', function(){
it('add', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Vowel', 'http://www.w3.org/2000/01/rdf-schema#subClassOf', 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Vowel'));
g.add(triple('http://example.com/A', 'http://example.com/nextLetter', 'http://example.com/B'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.match(null, null, null).length, 7);
assert.equal(g.toArray().length, 7);
assert.equal(g.match(null, rdfns('type'), null).length, 5);
assert.equal(g.match(null, rdfns('type'), 'http://example.com/Letter').length, 3);
assert.equal(g.match('http://example.com/A', null, null).length, 3);
assert.equal(g.match('http://example.com/A', rdfns('type'), null).length, 2);
assert.equal(g.match('http://example.com/A', rdfns('type'), 'http://example.com/Letter').length, 1);
var gg = new Graph;
gg.addAll(g);
assert.equal(gg.length, g.length);
});
it('add (multiples)', function(){
// "Graphs MUST NOT contain duplicate triples."
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.match(null, null, null).length, 2);
assert.equal(g.toArray().length, 2);
assert.equal(g.match(null, rdfns('type'), null).length, 2);
assert.equal(g.match(null, rdfns('type'), 'http://example.com/Letter').length, 1);
assert.equal(g.match('http://example.com/A', null, null).length, 1);
assert.equal(g.match('http://example.com/A', rdfns('type'), null).length, 1);
assert.equal(g.match('http://example.com/A', rdfns('type'), 'http://example.com/Letter').length, 1);
});
it('addAll', function(){
// "the import must not produce any duplicates."
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
var gg = new Graph;
assert.equal(gg.length, 0);
gg.addAll(g);
gg.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
assert.equal(gg.length, g.length);
assert.equal(gg.match(null, null, null).length, 2);
assert.equal(gg.toArray().length, 2);
assert.equal(gg.match(null, rdfns('type'), null).length, 2);
assert.equal(gg.match(null, rdfns('type'), 'http://example.com/Letter').length, 1);
assert.equal(gg.match('http://example.com/A', null, null).length, 1);
assert.equal(gg.match('http://example.com/A', rdfns('type'), null).length, 1);
assert.equal(gg.match('http://example.com/A', rdfns('type'), 'http://example.com/Letter').length, 1);
});
it('has', function(){
var g = new Graph;
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
assert(g.has(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter')));
assert(!g.has(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter')));
});
it('every', function(){
// "Universal quantification method, tests whether every Triple in the Graph passes the test implemented by the provided TripleFilter."
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.ok(g.every(function(triple){
return triple.predicate.equals(new rdf.NamedNode(rdfns('type')));
}));
assert.ok(!g.every(function(triple){
return triple.subject.equals(new rdf.NamedNode('http://example.com/Letter'));
}));
});
it('filter', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.filter(function(triple){
return triple.predicate.equals(new rdf.NamedNode(rdfns('type')));
}).length, 4);
assert.equal(g.filter(function(triple){
return triple.subject.equals(new rdf.NamedNode('http://example.com/Letter'));
}).length, 1);
assert.ok(g.filter(function(triple){ return true; }) instanceof rdf.Graph);
});
it('forEach', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('Letter', '@en')));
g.add(triple('http://example.com/A', rdfsns('label'), new rdf.Literal('A')));
g.add(triple('http://example.com/B', rdfsns('label'), new rdf.Literal('B')));
g.add(triple('http://example.com/C', rdfsns('label'), new rdf.Literal('C')));
var len = 0;
g.forEach(function(triple){
len += triple.object.valueOf().length;
});
assert.equal(len, 9);
});
it('match', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('Letter', '@en')));
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
var len = 0;
var matches = g.match(null, rdf.environment.createNamedNode(rdfns('type')), rdf.environment.createNamedNode('http://example.com/Letter'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches instanceof rdf.Graph);
});
it('match(iri, iri, iri)', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
var t = graph.match(
env.createNamedNode('http://example.com/foo'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
assert.ok(t); // returns empty Graph
assert.equal(t.length, 0);
});
it('match(bnode, iri, bnode)', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
var t = graph.match(
env.createNamedNode('http://example.com/foo'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
assert.ok(t); // returns empty Graph
assert.equal(t.length, 0);
});
it('match(iri, iri, literal)', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
var t = graph.match(
env.createNamedNode('http://example.com/foo'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
env.createLiteral('string!'),
);
assert.ok(t); // returns empty Graph
assert.equal(t.length, 0);
});
it('match: literal subject throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
env.createLiteral('string!'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
});
});
it('match: bnode predicate throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
env.createNamedNode('http://example.com/foo'),
env.createBlankNode(),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
});
});
it('match: literal predicate throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
env.createNamedNode('http://example.com/foo'),
env.createLiteral('string!'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
});
});
it('match: variable subject throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
new rdf.Variable('s'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
});
});
it('match: variable predicate throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
env.createNamedNode('http://example.com/foo'),
new rdf.Variable('p'),
env.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'),
);
});
});
it('match: variable object throws', function(){
var env = new rdf.RDFEnvironment;
var graph = new Graph;
assert.throws(function(){
graph.match(
env.createNamedNode('http://example.com/foo'),
env.createNamedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
new rdf.Variable('o'),
);
});
});
it('match (NamedNode)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var len = 0;
var matches = g.match(null, null, rdf.environment.createNamedNode('http://www.w3.org/2000/01/rdf-schema#Class'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches.toArray()[0].equals(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class')));
});
it('match (Literal)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var len = 0;
var matches = g.match(null, null, rdf.environment.createLiteral('http://www.w3.org/2000/01/rdf-schema#Class'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches.toArray()[0].equals(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class'))));
});
it('match (LanguageLiteral)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var len = 0;
var matches = g.match(null, null, rdf.environment.createLiteral('http://www.w3.org/2000/01/rdf-schema#Class', '@en'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches.toArray()[0].equals(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en'))));
});
it('match (xsd:string)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var len = 0;
var matches = g.match(null, null, rdf.environment.createLiteral('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches.toArray()[0].equals(triple('http://example.com/Letter', rdfsns('label'), rdf.environment.createLiteral('http://www.w3.org/2000/01/rdf-schema#Class'))));
});
it('match (xsd:anyURI)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var len = 0;
var matches = g.match(null, null, rdf.environment.createLiteral('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI'));
assert.equal(matches.length, 1);
assert.equal(matches.toArray().length, 1);
assert(matches.toArray()[0].equals(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI'))));
});
// TODO add test for `merge` which, despite the description in RDF Interfaces, should produce a different but isomorphic graph.
it('union', function(){
var g = new Graph;
var h = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
h.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
h.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
h.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
var m = g.union(h);
assert.equal(g.length, 1);
assert.equal(h.length, 3);
assert.equal(m.length, 4);
});
it('remove', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 4);
assert.equal(g.toArray().length, 4);
g.remove(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 3);
assert.equal(g.toArray().length, 3);
g.remove(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 3);
assert.equal(g.toArray().length, 3);
});
it('removeMatches (exact)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 4);
assert.equal(g.toArray().length, 4);
g.removeMatches(new rdf.NamedNode('http://example.com/C'), new rdf.NamedNode(rdfns('type')), new rdf.NamedNode('http://example.com/Letter'));
assert.equal(g.length, 3);
assert.equal(g.toArray().length, 3);
g.removeMatches(new rdf.NamedNode('http://example.com/C'), new rdf.NamedNode(rdfns('type')), new rdf.NamedNode('http://example.com/Letter'));
assert.equal(g.length, 3);
assert.equal(g.toArray().length, 3);
});
it('removeMatches (subject)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 4);
g.removeMatches(
new rdf.NamedNode('http://example.com/C'),
null,
null,
);
assert.equal(g.length, 3);
});
it('removeMatches (predicate)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 4);
g.removeMatches(
null,
new rdf.NamedNode(rdfns('type')),
null,
);
assert.equal(g.length, 0);
});
it('removeMatches (object)', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.equal(g.length, 4);
g.removeMatches(
null,
null,
new rdf.NamedNode('http://example.com/Letter'),
);
assert.equal(g.length, 1);
});
it('some', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
assert.ok(g.every(function(triple){
return triple.predicate.equals(new rdf.NamedNode(rdfns('type')));
}));
assert.ok(!g.every(function(triple){
return triple.subject.equals(new rdf.NamedNode('http://example.com/Letter'));
}));
});
it('toArray', function(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
g.add(triple('http://example.com/A', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/B', rdfns('type'), 'http://example.com/Letter'));
g.add(triple('http://example.com/C', rdfns('type'), 'http://example.com/Letter'));
var a = g.toArray();
assert(Array.isArray(a));
assert.equal(a.length, 4);
});
it('isomorphic', function(){
function gen(idx){
var gg = new Graph;
for(var ba = []; ba.length<5; ba.push(new rdf.BlankNode));
gg.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
gg.add(triple(ba[0], rdfns('type'), 'http://example.com/Letter'));
gg.add(triple(ba[0], rdfns('type'), ba[1]));
gg.add(triple(ba[0], rdfns('type'), ba[2]));
gg.add(triple(ba[idx], rdfns('type'), ba[3]));
gg.add(triple(ba[1], rdfns('type'), ba[4]));
return gg;
}
// Graph a
var ga = gen(1);
var gh = gen(1);
assert(ga.isomorphic(gh));
var gm = gen(2);
assert(!gm.isomorphic(ga));
});
it('equals (no bnodes positive)', function(){
function gen(sub){
var gg = new Graph;
for(var ba = []; ba.length<5; ba.push(new rdf.BlankNode));
gg.add(triple(sub, rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
gg.add(triple('http://example.com/A', rdfsns('label'), rdf.Literal.language('Label', 'en')));
return gg;
}
// Graph a
var ga = gen('http://example.com/A');
var gb = gen('http://example.com/A');
assert(ga.equals(gb));
});
it('equals (no bnodes negative)', function(){
function gen(sub){
var gg = new Graph;
for(var ba = []; ba.length<5; ba.push(new rdf.BlankNode));
gg.add(triple(sub, rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
gg.add(triple('http://example.com/A', rdfsns('label'), rdf.Literal.language('Label', 'en')));
return gg;
}
// Graph a
var ga = gen('http://example.com/A');
var gb = gen('http://example.com/B');
assert(!ga.isomorphic(gb));
});
it('equals (various data positive)', function(){
function gen(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
return g;
}
// Graph a
var ga = gen();
var gb = gen();
assert(ga.isomorphic(gb));
});
it('equals (various data negative)', function(){
function gen(l){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', l)));
return g;
}
// Graph a
var ga = gen('@fr');
var gb = gen('@ja');
assert(!ga.isomorphic(gb));
});
});
describe('Graph#simplyEntails', function(){
// Test that a graph G simply entails a graph E
it('the empty graph is simply entailed by any graph', function(){
var empty = new Graph;
var anyGraph = new Graph;
anyGraph.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
assert(anyGraph.simplyEntails(empty));
});
it('the empty graph does not simply entail any graph except itself', function(){
var empty = new Graph;
var anyGraph = new Graph;
anyGraph.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
assert(!empty.simplyEntails(anyGraph));
assert(empty.simplyEntails(new Graph));
});
it('a graph simply entails all its subgraphs', function(){
var G = new Graph;
G.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('Letter')));
G.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
var E = new Graph;
G.add(triple('http://example.com/Letter', rdfns('type'), 'http://www.w3.org/2000/01/rdf-schema#Class'));
assert(G.simplyEntails(E));
});
it('a graph is simply entailed by any of its instances (1)', function(){
var graph = new Graph;
var b1 = new rdf.BlankNode;
graph.add(triple('http://example.com/Letter', rdfsns('label'), b1));
assert(graph.length, 1);
var instance = new Graph;
var b2 = new rdf.BlankNode;
instance.add(triple('http://example.com/Letter', rdfsns('label'), b2));
assert(instance.length, 1);
var map = graph.simplyEntails(instance);
assert(map);
assert(b1.equals(map[b2]));
});
it('a graph is simply entailed by any of its instances (2)', function(){
var graph = new Graph;
var b1 = new rdf.Literal('string');
graph.add(triple('http://example.com/Letter', rdfsns('label'), b1));
assert(graph.length, 1);
var instance = new Graph;
var b2 = new rdf.BlankNode;
instance.add(triple('http://example.com/Letter', rdfsns('label'), b2));
assert(instance.length, 1);
var map = graph.simplyEntails(instance);
assert(map);
assert(b1.equals(map[b2]));
});
it('If E is a lean graph and E1 is a proper instance of E, then E does not simply entail E1', function(){
var E = new Graph;
var bx = new rdf.BlankNode;
E.add(triple('http://example.com/a', 'http://example.com/P', bx));
E.add(triple(bx, 'http://example.com/P', bx));
var E1 = new Graph;
E1.add(triple('http://example.com/a', 'http://example.com/P', 'http://example.com/w'));
E1.add(triple('http://example.com/w', 'http://example.com/P', 'http://example.com/w'));
assert(!E.simplyEntails(E1));
});
it('simplyEntails (various data positive)', function(){
function gen(){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
return g;
}
// Graph a
var ga = gen();
var gb = gen();
assert(ga.simplyEntails(gb));
});
it('simplyEntails (subset positive)', function(){
var ga = new Graph;
ga.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
ga.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
ga.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
ga.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
var gb = new Graph;
gb.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
assert(ga.simplyEntails(gb));
});
it('simplyEntails (bnode positive)', function(){
function gen(node){
var g = new Graph;
g.add(triple(node, rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple(node, rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple(node, rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple(node, rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
return g;
}
// Graph a
var ga = gen('http://example.com/Letter');
var gb = gen(new rdf.BlankNode);
assert(ga.simplyEntails(gb));
});
it('simplyEntails (various data negative)', function(){
function gen(l){
var g = new Graph;
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', '@en')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#string')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', 'http://www.w3.org/2001/XMLSchema#anyURI')));
g.add(triple('http://example.com/Letter', rdfsns('label'), new rdf.Literal('http://www.w3.org/2000/01/rdf-schema#Class', l)));
return g;
}
// Graph a
var ga = gen('@fr');
var gb = gen('@ja');
assert(!ga.simplyEntails(gb));
});
});
}
describe('Graph', function(){
GenerateGraphTest(rdf.Graph);
});