COMMONSRDF-74: Add Dataset and DatasetGraph conversions to JenaRDF
Merge commit 'refs/pull/52/head' of https://github.com/apache/commons-rdf
Thanks, @ajs6f
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
index 6e41b93..62327a8 100644
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
@@ -39,12 +39,14 @@
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.query.DatasetFactory;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFLanguages;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.riot.system.StreamRDFBase;
import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphFactory;
import org.apache.jena.sparql.graph.GraphFactory;
/**
@@ -665,6 +667,39 @@
}
/**
+ * Convert a CommonsRDF Dataset to a Jena Dataset. If the Dataset was from Jena
+ * originally, return that original object wrapped else create a copy using Jena
+ * objects.
+ *
+ * @param dataset
+ * Commons RDF {@link Dataset} to convert
+ * @return Converted Jena {@link org.apache.jena.query.Dataset}
+ */
+ public org.apache.jena.query.Dataset asJenaDataset(final Dataset dataset) {
+ return DatasetFactory.wrap(asJenaDatasetGraph(dataset));
+ }
+
+ /**
+ * Convert a CommonsRDF Dataset to a Jena DatasetGraph. If the Dataset was from Jena
+ * originally, return that original object's underlying DatasetGraph else create a
+ * copy using Jena objects.
+ *
+ * @param dataset
+ * Commons RDF {@link Dataset} to convert
+ * @return Converted Jena {@link org.apache.jena.sparql.core.DatasetGraph}
+ */
+ public DatasetGraph asJenaDatasetGraph(final Dataset dataset) {
+ final DatasetGraph dsg;
+ if (dataset instanceof JenaDataset)
+ dsg = ((JenaDataset) dataset).asJenaDatasetGraph();
+ else {
+ dsg = DatasetGraphFactory.createGeneral();
+ dataset.stream().map(this::asJenaQuad).forEach(dsg::add);
+ }
+ return dsg;
+ }
+
+ /**
* Convert a CommonsRDF Graph to a Jena Graph. If the Graph was from Jena
* originally, return that original object else create a copy using Jena
* objects.
diff --git a/commons-rdf-jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java b/commons-rdf-jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
index fd50421..40687ce 100644
--- a/commons-rdf-jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
+++ b/commons-rdf-jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
@@ -17,14 +17,64 @@
*/
package org.apache.commons.rdf.jena;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
import org.apache.commons.rdf.api.AbstractRDFTest;
-import org.apache.commons.rdf.api.RDF;
+import org.apache.commons.rdf.api.BlankNode;
+import org.apache.commons.rdf.api.Dataset;
+import org.apache.commons.rdf.api.IRI;
+import org.apache.commons.rdf.api.Quad;
+import org.apache.commons.rdf.simple.SimpleRDF;
+import org.apache.jena.rdf.model.Model;
+import org.apache.jena.rdf.model.Property;
+import org.apache.jena.rdf.model.RDFNode;
+import org.apache.jena.rdf.model.Resource;
+import org.apache.jena.rdf.model.Statement;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphFactory;
+import org.junit.Test;
public class JenaRDFTest extends AbstractRDFTest {
@Override
- public RDF createFactory() {
+ public JenaRDF createFactory() {
return new JenaRDF();
}
+ @Test
+ public void roundTripDatasetGraphShouldMaintainIdentity() {
+ DatasetGraph dsg = DatasetGraphFactory.create();
+ JenaDataset dataset = createFactory().asDataset(dsg);
+ DatasetGraph roundTrippedDSG = createFactory().asJenaDatasetGraph(dataset);
+ assertSame("Should have gotten the same DatasetGraph object from a round trip!", dsg, roundTrippedDSG);
+ }
+
+ @Test
+ public void testSimpleDatasetConversion() {
+ SimpleRDF factory = new SimpleRDF();
+ Dataset ds = factory.createDataset();
+ final BlankNode subject = factory.createBlankNode("b1");
+ final IRI predicate = factory.createIRI("http://example.com/pred");
+ final IRI object = factory.createIRI("http://example.com/obj");
+ final IRI graph = factory.createIRI("http://example.com/graph");
+ final Quad quad = factory.createQuad(graph, subject, predicate, object);
+ ds.add(quad);
+ JenaRDF jenaFactory = createFactory();
+ org.apache.jena.query.Dataset jenaDS = jenaFactory.asJenaDataset(ds);
+ assertEquals("Should have found one named graph!", 1, jenaDS.asDatasetGraph().size());
+ Model namedModel = jenaDS.getNamedModel(graph.getIRIString());
+ assertEquals("Should have found one triple in named graph!", 1, namedModel.size());
+ Statement statement = namedModel.listStatements().next();
+ Resource jenaSubject = statement.getSubject();
+ Property jenaPredicate = statement.getPredicate();
+ RDFNode jenaObject = statement.getObject();
+ assertTrue(jenaSubject.isAnon());
+ assertTrue(jenaObject.isResource());
+ assertEquals(subject.ntriplesString(), "_:" + jenaSubject.getId().getLabelString());
+ assertEquals(predicate.getIRIString(), jenaPredicate.getURI());
+ assertEquals(object.getIRIString(), jenaObject.asResource().getURI());
+ }
+
}