/** * Test that a transitive reduction is complete. * Assumes test graph has no cycles (other than the trivial * identity ones). */ public void doTestTransitiveReduction(Model model, Property dp) { InfModel im = ModelFactory.createInfModel(ReasonerRegistry.getTransitiveReasoner(), model); for (ResIterator i = im.listSubjects(); i.hasNext();) { Resource base = i.nextResource(); List<RDFNode> directLinks = new ArrayList<>(); for (NodeIterator j = im.listObjectsOfProperty(base, dp); j.hasNext(); ) { directLinks.add(j.next()); } for (int n = 0; n < directLinks.size(); n++) { Resource d1 = (Resource)directLinks.get(n); for (int m = n+1; m < directLinks.size(); m++) { Resource d2 = (Resource)directLinks.get(m); if (im.contains(d1, dp, d2) && ! base.equals(d1) && !base.equals(d2)) { assertTrue("Triangle discovered in transitive reduction", false); } } } } }
/** * Test that a transitive reduction is complete. * Assumes test graph has no cycles (other than the trivial * identity ones). */ public void doTestTransitiveReduction(Model model, Property dp) { InfModel im = ModelFactory.createInfModel(ReasonerRegistry.getTransitiveReasoner(), model); for (ResIterator i = im.listSubjects(); i.hasNext();) { Resource base = i.nextResource(); List<RDFNode> directLinks = new ArrayList<>(); for (NodeIterator j = im.listObjectsOfProperty(base, dp); j.hasNext(); ) { directLinks.add(j.next()); } for (int n = 0; n < directLinks.size(); n++) { Resource d1 = (Resource)directLinks.get(n); for (int m = n+1; m < directLinks.size(); m++) { Resource d2 = (Resource)directLinks.get(m); if (im.contains(d1, dp, d2) && ! base.equals(d1) && !base.equals(d2)) { assertTrue("Triangle discovered in transitive reduction", false); } } } } }
/** * The reasoner contract for bind(data) is not quite precise. It allows for * reasoners which have state so that reusing the same reasoner on a second data * model might lead to interference. This in fact used to happen with the transitive * reasoner. This is a test to check that the transitive reasoner state reuse has been fixed at source. */ public void testTransitiveBindReuse() { Reasoner r = ReasonerRegistry.getTransitiveReasoner(); InfModel om1 = ModelFactory.createInfModel(r, ModelFactory.createDefaultModel()); Resource c1 = om1.createResource(PrintUtil.egNS + "Class1"); Resource c2 = om1.createResource(PrintUtil.egNS + "Class2"); Resource c3 = om1.createResource(PrintUtil.egNS + "Class3"); om1.add(c1, RDFS.subClassOf, c2); om1.add(c2, RDFS.subClassOf, c3); om1.prepare(); assertFalse(om1.isEmpty()); InfModel om2 = ModelFactory.createInfModel(r, ModelFactory.createDefaultModel()); StmtIterator si = om2.listStatements(); boolean ok = ! si.hasNext(); si.close(); assertTrue("Transitive reasoner state leak", ok); }
/** * The reasoner contract for bind(data) is not quite precise. It allows for * reasoners which have state so that reusing the same reasoner on a second data * model might lead to interference. This in fact used to happen with the transitive * reasoner. This is a test to check that the transitive reasoner state reuse has been fixed at source. */ public void testTransitiveBindReuse() { Reasoner r = ReasonerRegistry.getTransitiveReasoner(); InfModel om1 = ModelFactory.createInfModel(r, ModelFactory.createDefaultModel()); Resource c1 = om1.createResource(PrintUtil.egNS + "Class1"); Resource c2 = om1.createResource(PrintUtil.egNS + "Class2"); Resource c3 = om1.createResource(PrintUtil.egNS + "Class3"); om1.add(c1, RDFS.subClassOf, c2); om1.add(c2, RDFS.subClassOf, c3); om1.prepare(); assertFalse(om1.isEmpty()); InfModel om2 = ModelFactory.createInfModel(r, ModelFactory.createDefaultModel()); StmtIterator si = om2.listStatements(); boolean ok = ! si.hasNext(); si.close(); assertTrue("Transitive reasoner state leak", ok); }
/** * Test that two transitive engines are independent. * See JENA-1260 */ public void testTransitiveEngineSeparation() throws InterruptedException { String NS = "http://example.com/test#"; Property sp = ResourceFactory.createProperty(NS, "sp"); Property p = ResourceFactory.createProperty(NS, "p"); Property s = ResourceFactory.createProperty(NS, "s"); Resource q = ResourceFactory.createProperty(NS, "q"); Reasoner reasoner = ReasonerRegistry.getTransitiveReasoner(); InfModel simple = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel()); simple.add(s, sp, p); assertFalse( simple.contains(s, RDFS.subPropertyOf, p) ); InfModel withSP = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel()); withSP.add(sp, RDFS.subPropertyOf, RDFS.subPropertyOf); withSP.add(s, sp, p); assertTrue( withSP.contains(s, RDFS.subPropertyOf, p) ); simple.add(q, sp, p); assertFalse( simple.contains(q, RDFS.subPropertyOf, p) ); }
/** * Test that two transitive engines are independent. * See JENA-1260 */ public void testTransitiveEngineSeparation() throws InterruptedException { String NS = "http://example.com/test#"; Property sp = ResourceFactory.createProperty(NS, "sp"); Property p = ResourceFactory.createProperty(NS, "p"); Property s = ResourceFactory.createProperty(NS, "s"); Resource q = ResourceFactory.createProperty(NS, "q"); Reasoner reasoner = ReasonerRegistry.getTransitiveReasoner(); InfModel simple = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel()); simple.add(s, sp, p); assertFalse( simple.contains(s, RDFS.subPropertyOf, p) ); InfModel withSP = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel()); withSP.add(sp, RDFS.subPropertyOf, RDFS.subPropertyOf); withSP.add(s, sp, p); assertTrue( withSP.contains(s, RDFS.subPropertyOf, p) ); simple.add(q, sp, p); assertFalse( simple.contains(q, RDFS.subPropertyOf, p) ); }