blob: 77d5fcbfe6633029e3bb2708bf3dd7c0d3fcc3a1 [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.commons.rdf.jena;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import org.apache.commons.rdf.api.BlankNode;
import org.apache.commons.rdf.api.BlankNodeOrIRI;
import org.apache.commons.rdf.api.Graph;
import org.apache.commons.rdf.api.RDFTerm;
import org.apache.commons.rdf.api.Triple;
import org.apache.commons.rdf.simple.Types;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.sparql.graph.GraphFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/** Adapt a Jena Graph after parsing data into it */
public class TestJenaGraphToCommonsRDFGraph {
private static final boolean DEBUG = false;
private Path turtleFile;
@Before
public void preparePath() throws IOException {
turtleFile = Files.createTempFile("commonsrdf", "test.ttl");
Files.copy(getClass().getResourceAsStream("/D.ttl"), turtleFile, StandardCopyOption.REPLACE_EXISTING);
}
@After
public void deletePath() throws IOException {
if (turtleFile != null) {
Files.deleteIfExists(turtleFile);
}
}
@Test
public void jenaToCommonsRDF() throws Exception {
final org.apache.jena.graph.Graph jGraph = GraphFactory.createGraphMem();
RDFDataMgr.read(jGraph, turtleFile.toUri().toString());
final JenaRDF factory = new JenaRDF();
// "graph" is a CommonsRDF graph
try (final Graph graph = factory.asGraph(jGraph)) {
// The below check expected statements from D.ttl
final JenaIRI p = factory.createIRI("http://example.com/p");
final JenaIRI s = factory.createIRI("http://example.com/s");
final JenaLiteral literal123 = factory.createLiteral("123", Types.XSD_INTEGER);
assertTrue(graph.contains(s, p, literal123));
final JenaIRI p1 = factory.createIRI("http://example.com/p1");
// Let's look up the BlankNode
final BlankNodeOrIRI bnode1 = graph.stream(null, p1, null).findFirst().map(Triple::getSubject).get();
assertTrue(bnode1 instanceof BlankNode);
// Verify we can use BlankNode in query again
final RDFTerm obj = graph.stream(bnode1, p1, null).findFirst().map(Triple::getObject).get();
// Let's look up also that nested blank node
assertTrue(obj instanceof BlankNode);
final BlankNode bnode2 = (BlankNode) obj;
final JenaIRI q = factory.createIRI("http://example.com/q");
final JenaLiteral literalR = factory.createLiteral("r", "en");
assertTrue(graph.contains(bnode2, q, literalR));
// Can we add the same triple again as s/p/o
// without affecting graph size?
// Just to be evil we add a blanknode-iri-blanknode statement
assertEquals(3, graph.size());
graph.add(bnode1, p1, bnode2);
assertEquals(3, graph.size());
// Add the same Triple again
graph.stream(bnode2, null, null).findFirst().ifPresent(graph::add);
assertEquals(3, graph.size());
// Add to CommonsRDF Graph
final JenaIRI s2 = factory.createIRI("http://example/s2");
final JenaIRI p2 = factory.createIRI("http://example/p2");
final JenaLiteral foo = factory.createLiteral("foo");
graph.add(s2, p2, foo);
assertEquals(4, graph.size());
assertTrue(graph.contains(s2, p2, foo));
// Verify the corresponding Jena Nodes are in Jena graph
assertTrue(jGraph.contains(s2.asJenaNode(), p2.asJenaNode(), foo.asJenaNode()));
if (DEBUG) {
System.out.println("==== Write CommonsRDF graph\n");
graph.stream().forEach(System.out::println);
// And its in the Jena graph
System.out.println("\n==== Write Jena graph directly\n");
RDFDataMgr.write(System.out, jGraph, Lang.TTL);
}
}
}
}