blob: 04cc982ecb98f7b0a5b7cea3d1c1f214865fed4a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.graph.test;
import org.apache.jena.graph.* ;
import org.apache.jena.rdf.model.impl.ReifierStd ;
import org.apache.jena.shared.AlreadyReifiedException ;
import org.apache.jena.shared.CannotReifyException ;
import org.apache.jena.vocabulary.RDF ;
/**
Abstract base class for reification tests.
*/
public abstract class AbstractTestReifier extends GraphTestBase
{
protected static final Triple ALL = Triple.ANY;
public AbstractTestReifier( String name )
{ super( name ); }
public abstract Graph getGraph();
protected final Graph getGraphWith( String facts )
{
Graph result = getGraph();
graphAdd( result, facts );
return result;
}
/**
Answer the empty graph if cond is false, otherwise the graph with the given facts.
*/
protected final Graph graphWithUnless( boolean cond, String facts )
{ return graphWith( cond ? "" : facts ); }
protected final Graph graphWithIf( boolean cond, String facts )
{ return graphWithUnless( !cond, facts ); }
public void testGetGraphNotNull()
{ assertNotNull( getGraph() ); }
/**
Check that the standard reifier will note, but not hide, reification quads.
*/
public void testStandard()
{
Graph g = getGraph( );
assertFalse( ReifierStd.hasTriple(g, triple( "s p o" ) ) );
g.add( NodeCreateUtils.createTriple( "x rdf:subject s" ) );
assertEquals( 1, g.size() );
g.add( NodeCreateUtils.createTriple( "x rdf:predicate p" ) );
assertEquals( 2, g.size() );
g.add( NodeCreateUtils.createTriple( "x rdf:object o" ) );
assertEquals( 3, g.size() );
g.add( NodeCreateUtils.createTriple( "x rdf:type rdf:Statement" ) );
assertEquals( 4, g.size() );
assertTrue( ReifierStd.hasTriple(g, triple( "s p o" ) ) );
}
/**
Test that the Standard reifier will expose implicit quads arising from reifyAs().
*/
public void testStandardExplode()
{
Graph g = getGraph( );
ReifierStd.reifyAs( g, node( "a" ), triple( "p Q r" ) );
Graph r = Factory.createDefaultGraph( );
graphAdd( r, "a rdf:type rdf:Statement; a rdf:subject p; a rdf:predicate Q; a rdf:object r" );
assertEquals( 4, g.size() );
assertIsomorphic( r, g );
}
/**
Ensure that over-specifying a reification means that we don't get a triple
back. Goodness knows why this test wasn't in right from the beginning.
*/
public void testOverspecificationSuppressesReification()
{
Graph g = getGraph();
graphAdd( g, "x rdf:subject A; x rdf:predicate P; x rdf:object O; x rdf:type rdf:Statement" );
assertEquals( triple( "A P O" ), ReifierStd.getTriple(g, node( "x" ) ) );
graphAdd( g, "x rdf:subject BOOM" );
assertEquals( null, ReifierStd.getTriple( g, node( "x" ) ) );
}
public void testReificationSubjectClash()
{
testReificationClash( "x rdf:subject SS" );
}
public void testReificationPredicateClash()
{
testReificationClash( "x rdf:predicate PP" );
}
public void testReificationObjectClash()
{
testReificationClash( "x rdf:object OO" );
}
protected void testReificationClash( String clashingStatement )
{
Graph g = getGraph();
Triple SPO = NodeCreateUtils.createTriple( "S P O" );
ReifierStd.reifyAs(g, node( "x" ), SPO );
assertTrue( ReifierStd.hasTriple( g , SPO ) );
graphAdd( g, clashingStatement );
assertEquals( null, ReifierStd.getTriple( g , node( "x" ) ) );
// System.err.println( ">> tRC: clashing = " + clashingStatement );
assertFalse( ReifierStd.hasTriple(g, SPO ) );
}
/**
Test that reifying a triple explicitly has some effect on the graph only for Standard
reifiers.
*/
public void testManifestQuads()
{
Graph g = getGraph();
ReifierStd.reifyAs(g, node( "A" ), triple( "S P O" ) ) ;
String reified = "A rdf:type rdf:Statement; A rdf:subject S; A rdf:predicate P; A rdf:object O";
assertIsomorphic( graphWith( reified ), g );
}
public void testHiddenVsReification()
{
Graph g = getGraph();
ReifierStd.reifyAs( g, node( "A" ), triple( "S P O" ) );
assertTrue( ReifierStd.findEither( g , ALL, false ).hasNext() );
}
public void testRetrieveTriplesByNode()
{
Graph G = getGraph();
Node N = NodeFactory.createBlankNode(), M = NodeFactory.createBlankNode();
ReifierStd.reifyAs( G , N, triple( "x R y" ) );
assertEquals( "gets correct triple", triple( "x R y" ), ReifierStd.getTriple( G , N ) );
ReifierStd.reifyAs( G, M, triple( "p S q" ) );
assertDiffer( "the anon nodes must be distinct", N, M );
assertEquals( "gets correct triple", triple( "p S q" ), ReifierStd.getTriple( G , M ) );
assertTrue( "node is known bound", ReifierStd.hasTriple( G, M ) );
assertTrue( "node is known bound", ReifierStd.hasTriple( G, N ) );
assertFalse( "node is known unbound", ReifierStd.hasTriple( G, NodeFactory.createURI( "any:thing" ) ) );
}
public void testRetrieveTriplesByTriple()
{
Graph G = getGraph();
Triple T = triple( "x R y" ), T2 = triple( "y R x" );
Node N = node( "someNode" );
ReifierStd.reifyAs( G, N, T );
assertTrue( "R must have T", ReifierStd.hasTriple( G, T ) );
assertFalse( "R must not have T2", ReifierStd.hasTriple( G, T2 ) );
}
public void testReifyAs()
{
Graph G = getGraph();
Node X = NodeFactory.createURI( "some:uri" );
assertEquals( "node used", X, ReifierStd.reifyAs( G, X, triple( "x R y" ) ) );
assertEquals( "retrieves correctly", triple( "x R y" ), ReifierStd.getTriple( G, X ) );
}
public void testAllNodes()
{
Graph G = getGraph();
ReifierStd.reifyAs( G, node("x"), triple( "cows eat grass" ) );
ReifierStd.reifyAs( G, node("y"), triple( "pigs can fly" ) );
ReifierStd.reifyAs( G, node("z"), triple( "dogs may bark" ) );
assertEquals( "", nodeSet( "z y x" ), iteratorToSet( ReifierStd.allNodes(G) ) );
}
public void testRemoveByNode()
{
Graph G = getGraph();
Node X = node( "x" ), Y = node( "y" );
ReifierStd.reifyAs( G, X, triple( "x R a" ) );
ReifierStd.reifyAs( G, Y, triple( "y R a" ) );
ReifierStd.remove( G, X, triple( "x R a" ) );
assertFalse( "triple X has gone", ReifierStd.hasTriple( G, X ) );
assertEquals( "triple Y still there", triple( "y R a" ), ReifierStd.getTriple( G, Y ) );
}
public void testRemoveFromNothing()
{
Graph G = getGraph();
G.delete( triple( "quint rdf:subject S" ) );
}
public void testException()
{
Graph G = getGraph();
Node X = node( "x" );
ReifierStd.reifyAs( G, X, triple( "x R y" ) );
ReifierStd.reifyAs( G, X, triple( "x R y" ) );
try { ReifierStd.reifyAs( G, X, triple( "x R z" ) ); fail( "did not detect already reified node" ); }
catch (AlreadyReifiedException e) { }
}
public void testKevinCaseA()
{
Graph G = getGraph();
Node X = node( "x" ), a = node( "a" ), b = node( "b" ), c = node( "c" );
G.add( Triple.create( X, RDF.Nodes.type, RDF.Nodes.Statement ) );
ReifierStd.reifyAs( G, X, Triple.create( a, b, c ) );
}
public void testKevinCaseB()
{
Graph G = getGraph();
Node X = node( "x" ), Y = node( "y" );
Node a = node( "a" ), b = node( "b" ), c = node( "c" );
G.add( Triple.create( X, RDF.Nodes.subject, Y ) );
try
{
ReifierStd.reifyAs( G, X, Triple.create( a, b, c ) );
fail( "X already has subject Y: cannot make it a" );
}
catch (CannotReifyException e)
{ pass(); }
}
public void testQuadRemove()
{
Graph g = getGraph();
assertEquals( 0, g.size() );
Triple s = NodeCreateUtils.createTriple( "x rdf:subject s" );
Triple p = NodeCreateUtils.createTriple( "x rdf:predicate p" );
Triple o = NodeCreateUtils.createTriple( "x rdf:object o" );
Triple t = NodeCreateUtils.createTriple( "x rdf:type rdf:Statement");
g.add(s); g.add(p); g.add(o); g.add(t);
assertEquals( 4, g.size() );
g.delete(s); g.delete(p); g.delete(o); g.delete(t);
assertEquals( 0, g.size() );
}
public void testEmpty()
{
Graph g = getGraph();
assertTrue( g.isEmpty() );
graphAdd( g, "x rdf:type rdf:Statement" ); assertFalse( g.isEmpty() );
graphAdd( g, "x rdf:subject Deconstruction" ); assertFalse( g.isEmpty() );
graphAdd( g, "x rdf:predicate rdfs:subTypeOf" ); assertFalse( g.isEmpty() );
graphAdd( g, "x rdf:object LiteraryCriticism" ); assertFalse( g.isEmpty() );
}
public void testReifierEmptyFind()
{
Graph g = getGraph();
assertEquals( tripleSet( "" ), ReifierStd.findExposed( g , Triple.ANY ).toSet() );
}
public void testReifierFindSubject()
{ testReifierFind( "x rdf:subject S" ); }
public void testReifierFindObject()
{ testReifierFind( "x rdf:object O" ); }
public void testReifierFindPredicate()
{ testReifierFind( "x rdf:predicate P" ); }
public void testReifierFindComplete()
{ testReifierFind( "x rdf:predicate P; x rdf:subject S; x rdf:object O; x rdf:type rdf:Statement" ); }
public void testReifierFindFilter()
{
Graph g = getGraph();
graphAdd( g, "s rdf:subject S" );
assertEquals( tripleSet( "" ), ReifierStd.findExposed( g, triple( "s otherPredicate S" ) ).toSet() );
}
protected void testReifierFind( String triples )
{ testReifierFind( triples, "?? ?? ??" ); }
protected void testReifierFind( String triples, String pattern )
{
Graph g = getGraph();
graphAdd( g, triples );
assertEquals( tripleSet( triples ), ReifierStd.findExposed( g, triple( pattern ) ).toSet() );
}
}