Added RepositoryGraphImpl
Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/99bd16f6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/99bd16f6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/99bd16f6 Branch: refs/heads/rdf4j Commit: 99bd16f6576ffed1efbbe3a734f77e7d82ac1157 Parents: 712eec6 Author: Stian Soiland-Reyes <st...@apache.org> Authored: Fri Jun 3 11:54:39 2016 +0100 Committer: Stian Soiland-Reyes <st...@apache.org> Committed: Fri Jun 3 11:54:39 2016 +0100 ---------------------------------------------------------------------- .../apache/commons/rdf/rdf4j/RDF4JGraph.java | 24 ++- .../commons/rdf/rdf4j/RDF4JTermFactory.java | 132 +++++++++------- .../commons/rdf/rdf4j/impl/BlankNodeImpl.java | 32 ++-- .../commons/rdf/rdf4j/impl/GraphImpl.java | 44 +++--- .../apache/commons/rdf/rdf4j/impl/QuadImpl.java | 34 ++--- .../rdf/rdf4j/impl/RepositoryGraphImpl.java | 153 +++++++++++++++++++ .../commons/rdf/rdf4j/impl/TripleImpl.java | 4 +- 7 files changed, 310 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java index 2fcd2ea..abc4a98 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java @@ -17,8 +17,11 @@ */ package org.apache.commons.rdf.rdf4j; +import java.util.Optional; + import org.apache.commons.rdf.api.Graph; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.repository.Repository; /** @@ -28,12 +31,29 @@ import org.eclipse.rdf4j.model.Model; public interface RDF4JGraph extends Graph { /** - * Return the corresponding RDF4J {@link Model}. + * Return the corresponding RDF4J {@link Model}, if present. + * <p> + * The return value is {@link Optional#isPresent()} if this graph is + * backed by a Model. * <p> * Changes to the Model are reflected in this Graph, and * vice versa. * * @return The corresponding RDF4J Model. */ - public Model asModel(); + public Optional<Model> asModel(); + + /** + * Return the corresponding RDF4J {@link Repository}, if present. + * <p> + * The return value is {@link Optional#isPresent()} if this graph is + * backed by a Repository. + * <p> + * Changes to the Repository are reflected in this Graph, and + * vice versa. + * + * @return The corresponding RDF4J Repository. + */ + public Optional<Repository> asRepository(); + } http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java index 3df7de9..125a46c 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java @@ -34,6 +34,7 @@ import org.apache.commons.rdf.rdf4j.impl.GraphImpl; import org.apache.commons.rdf.rdf4j.impl.IRIImpl; import org.apache.commons.rdf.rdf4j.impl.LiteralImpl; import org.apache.commons.rdf.rdf4j.impl.QuadImpl; +import org.apache.commons.rdf.rdf4j.impl.RepositoryGraphImpl; import org.apache.commons.rdf.rdf4j.impl.TripleImpl; import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.Model; @@ -42,6 +43,7 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.repository.Repository; /** * RDF4J implementation of RDFTermFactory @@ -72,18 +74,6 @@ import org.eclipse.rdf4j.model.impl.SimpleValueFactory; */ public class RDF4JTermFactory implements RDFTermFactory { - private UUID salt = UUID.randomUUID(); - - private ValueFactory valueFactory; - - public RDF4JTermFactory() { - this.valueFactory = SimpleValueFactory.getInstance(); - } - - public RDF4JTermFactory(ValueFactory valueFactory) { - this.valueFactory = valueFactory; - } - /** * * Adapt a RDF4J {@link Value} as a Commons RDF @@ -102,11 +92,54 @@ public class RDF4JTermFactory implements RDFTermFactory { * @param value * @return */ - public RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value) { - return asRDFTerm(value, salt); + public static RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value, UUID salt) { + if (value instanceof BNode) { + return new BlankNodeImpl((BNode) value, salt); + } + if (value instanceof org.eclipse.rdf4j.model.Literal) { + return new LiteralImpl((org.eclipse.rdf4j.model.Literal) value); + } + if (value instanceof org.eclipse.rdf4j.model.IRI) { + return new IRIImpl((org.eclipse.rdf4j.model.IRI) value); + } + throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass()); } /** + * Adapt a RDF4J {@link Statement} as a Commons RDF + * {@link Triple}. + * + * @param statement + * @return + */ + public static RDF4JTriple asTriple(final Statement statement, UUID salt) { + return new TripleImpl(statement, salt); + } + + private UUID salt = UUID.randomUUID(); + + private ValueFactory valueFactory; + + public RDF4JTermFactory() { + this.valueFactory = SimpleValueFactory.getInstance(); + } + + public RDF4JTermFactory(ValueFactory valueFactory) { + this.valueFactory = valueFactory; + } + + /** + * Adapt a RDF4J {@link Statement} as a Commons RDF + * {@link Quad}. + * + * @param statement + * @return A {@link RDF4JQuad} that is equivalent to the statement + */ + public RDF4JQuad asQuad(final Statement statement) { + return new QuadImpl(statement, salt); + } + + /** * * Adapt a RDF4J {@link Value} as a Commons RDF * {@link RDFTerm}. @@ -124,19 +157,10 @@ public class RDF4JTermFactory implements RDFTermFactory { * @param value * @return */ - public static RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value, UUID salt) { - if (value instanceof BNode) { - return new BlankNodeImpl((BNode) value, salt); - } - if (value instanceof org.eclipse.rdf4j.model.Literal) { - return new LiteralImpl((org.eclipse.rdf4j.model.Literal) value); - } - if (value instanceof org.eclipse.rdf4j.model.IRI) { - return new IRIImpl((org.eclipse.rdf4j.model.IRI) value); - } - throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass()); + public RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value) { + return asRDFTerm(value, salt); } - + /** * Adapt an RDF4J {@link Model} as a * Commons RDF {@link Graph}. @@ -150,7 +174,30 @@ public class RDF4JTermFactory implements RDFTermFactory { public RDF4JGraph asRDFTermGraph(Model model) { return new GraphImpl(model); } + + /** + * Adapt an RDF4J {@link Repository} as a + * Commons RDF {@link Graph}. + * <p> + * Changes to the graph are reflected in the repository, and + * vice versa. + * + * @param model RDF4J {@link Repository} to connect to. + * @return Adapted {@link Graph}. + */ + public RDF4JGraph asRDFTermGraph(Repository repository) { + return new RepositoryGraphImpl(repository); + } + public Statement asStatement(Quad quad) { + return valueFactory.createStatement( + (org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), + (org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), + asValue(quad.getObject()), + (org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null)) + ); + } + public Statement asStatement(Triple triple) { if (triple instanceof RDF4JTripleLike) { // This covers both RDF4JQuad and RDF4JTriple @@ -161,16 +208,7 @@ public class RDF4JTermFactory implements RDFTermFactory { (org.eclipse.rdf4j.model.Resource) asValue(triple.getSubject()), (org.eclipse.rdf4j.model.IRI) asValue(triple.getPredicate()), asValue(triple.getObject())); - } - - public Statement asStatement(Quad quad) { - return valueFactory.createStatement( - (org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), - (org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), - asValue(quad.getObject()), - (org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null)) - ); - } + } /** * Adapt a RDF4J {@link Statement} as a Commons RDF @@ -182,28 +220,6 @@ public class RDF4JTermFactory implements RDFTermFactory { public RDF4JTriple asTriple(final Statement statement) { return new TripleImpl(statement, salt); } - - /** - * Adapt a RDF4J {@link Statement} as a Commons RDF - * {@link Quad}. - * - * @param statement - * @return A {@link RDF4JQuad} that is equivalent to the statement - */ - public RDF4JQuad asQuad(final Statement statement) { - return new QuadImpl(statement, salt); - } - - /** - * Adapt a RDF4J {@link Statement} as a Commons RDF - * {@link Triple}. - * - * @param statement - * @return - */ - public static RDF4JTriple asTriple(final Statement statement, UUID salt) { - return new TripleImpl(statement, salt); - } /** * Adapt a Commons RDF {@link RDFTerm} as a RDF4J {@link Value}. http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java index 6921f45..625088a 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java @@ -29,8 +29,8 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode> implements RDF4JBlankNode { private transient int hashCode = 0; - private long saltUUIDmost; private long saltUUIDleast; + private long saltUUIDmost; public BlankNodeImpl(BNode bNode, UUID salt) { super(bNode); @@ -60,21 +60,6 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode> return hashCode = uniqueReference().hashCode(); } - @Override - public String ntriplesString() { - if (isValidBlankNodeLabel(value.getID())) { - return "_:" + value.getID(); - } else { - return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8)); - } - } - - @Override - public String uniqueReference() { - UUID uuid = new UUID(saltUUIDmost, saltUUIDleast); - return "urn:uuid:" + uuid + "#" + value.getID(); - } - private boolean isValidBlankNodeLabel(String id) { // FIXME: Replace with a regular expression? if (id.isEmpty()) { @@ -90,4 +75,19 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode> } return true; } + + @Override + public String ntriplesString() { + if (isValidBlankNodeLabel(value.getID())) { + return "_:" + value.getID(); + } else { + return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8)); + } + } + + @Override + public String uniqueReference() { + UUID uuid = new UUID(saltUUIDmost, saltUUIDleast); + return "urn:uuid:" + uuid + "#" + value.getID(); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java index 966ac32..bf3aad2 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java @@ -17,6 +17,7 @@ */ package org.apache.commons.rdf.rdf4j.impl; +import java.util.Optional; import java.util.stream.Stream; import org.apache.commons.rdf.api.BlankNodeOrIRI; @@ -27,6 +28,7 @@ import org.apache.commons.rdf.rdf4j.RDF4JTermFactory; import org.apache.commons.rdf.rdf4j.RDF4JTriple; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.repository.Repository; public final class GraphImpl implements RDF4JGraph { @@ -56,11 +58,16 @@ public final class GraphImpl implements RDF4JGraph { model.add(rdf4jTermFactory.asStatement(triple)); } - public Model asModel() { - return model; + public Optional<Model> asModel() { + return Optional.of(model); } @Override + public Optional<Repository> asRepository() { + return Optional.empty(); + } + + @Override public void clear() { model.clear(); } @@ -79,26 +86,11 @@ public final class GraphImpl implements RDF4JGraph { } @Override - public Stream<RDF4JTriple> stream() { - return model.parallelStream().map(rdf4jTermFactory::asTriple); - } - - @Override - public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) { - return model.filter( - (Resource)rdf4jTermFactory.asValue(subject), - (org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), - rdf4jTermFactory.asValue(object)).parallelStream() - .map(rdf4jTermFactory::asTriple); - } - - @Override public void remove(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) { model.remove( (Resource)rdf4jTermFactory.asValue(subject), (org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), - rdf4jTermFactory.asValue(object)); - + rdf4jTermFactory.asValue(object)); } @Override @@ -112,8 +104,24 @@ public final class GraphImpl implements RDF4JGraph { if (size < Integer.MAX_VALUE) { return size; } else { + // TODO: Check if this can really happen with RDF4J models // Collection.size() can't help us, we'll have to count return model.parallelStream().count(); } } + + @Override + public Stream<RDF4JTriple> stream() { + return model.parallelStream().map(rdf4jTermFactory::asTriple); + } + + @Override + public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) { + return model.filter( + (Resource)rdf4jTermFactory.asValue(subject), + (org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), + rdf4jTermFactory.asValue(object)).parallelStream() + .map(rdf4jTermFactory::asTriple); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java index 0e11eb2..1d887a0 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java @@ -13,9 +13,9 @@ import org.apache.commons.rdf.rdf4j.RDF4JTermFactory; import org.eclipse.rdf4j.model.Statement; public final class QuadImpl implements Quad, RDF4JQuad { - private final Statement statement; + private transient int hashCode = 0; private UUID salt; - private transient int hashCode = 0; + private final Statement statement; public QuadImpl(Statement statement, UUID salt) { this.statement = statement; @@ -27,6 +27,11 @@ public final class QuadImpl implements Quad, RDF4JQuad { } @Override + public Triple asTriple() { + return new TripleImpl(statement, salt); + } + + @Override public boolean equals(Object obj) { if (obj instanceof Triple) { Triple triple = (Triple) obj; @@ -38,6 +43,15 @@ public final class QuadImpl implements Quad, RDF4JQuad { } @Override + public Optional<BlankNodeOrIRI> getGraphName() { + if (statement.getContext() == null) { + return Optional.empty(); + } + BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt); + return Optional.of(g); + } + + @Override public RDFTerm getObject() { return RDF4JTermFactory.asRDFTerm(statement.getObject(), salt); } @@ -51,7 +65,7 @@ public final class QuadImpl implements Quad, RDF4JQuad { public BlankNodeOrIRI getSubject() { return (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getSubject(), salt); } - + @Override public int hashCode() { if (hashCode != 0) { @@ -64,18 +78,4 @@ public final class QuadImpl implements Quad, RDF4JQuad { public String toString() { return statement.toString(); } - - @Override - public Optional<BlankNodeOrIRI> getGraphName() { - if (statement.getContext() == null) { - return Optional.empty(); - } - BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt); - return Optional.of(g); - } - - @Override - public Triple asTriple() { - return new TripleImpl(statement, salt); - } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java new file mode 100644 index 0000000..50ee2ee --- /dev/null +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java @@ -0,0 +1,153 @@ +package org.apache.commons.rdf.rdf4j.impl; + +import java.util.Optional; +import java.util.stream.Stream; + +import org.apache.commons.rdf.api.BlankNodeOrIRI; +import org.apache.commons.rdf.api.Graph; +import org.apache.commons.rdf.api.IRI; +import org.apache.commons.rdf.api.RDFTerm; +import org.apache.commons.rdf.api.Triple; +import org.apache.commons.rdf.rdf4j.RDF4JGraph; +import org.apache.commons.rdf.rdf4j.RDF4JTermFactory; +import org.apache.commons.rdf.rdf4j.RDF4JTriple; +import org.eclipse.rdf4j.common.iteration.Iterations; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryResult; + +public class RepositoryGraphImpl implements Graph, RDF4JGraph { + + private Repository repository; + private boolean includeInferred; + boolean shouldWeShutdown = false; + private RDF4JTermFactory rdf4jTermFactory; + + public RepositoryGraphImpl(Repository repository) { + this(repository, false); + } + + public RepositoryGraphImpl(Repository repository, boolean includeInferred) { + this.repository = repository; + this.includeInferred = includeInferred; + if (! repository.isInitialized()) { + repository.initialize(); + shouldWeShutdown = true; + } + rdf4jTermFactory = new RDF4JTermFactory(repository.getValueFactory()); + } + + + @Override + public void close() throws Exception { + if (shouldWeShutdown) { + repository.shutDown(); + } + // else: repository was initialized outside, so we should not shut it down + } + + @Override + public void add(Triple triple) { + Statement statement = rdf4jTermFactory.asStatement(triple); + try (RepositoryConnection conn = getRepositoryConnection()) { + conn.add(statement); + } + } + + @Override + public void add(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) { + Resource subj = (Resource) rdf4jTermFactory.asValue(subject); + org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate); + Value obj = rdf4jTermFactory.asValue(object); + try (RepositoryConnection conn = getRepositoryConnection()) { + conn.add(subj, pred, obj); + } + } + + @Override + public boolean contains(Triple triple) { + Statement statement = rdf4jTermFactory.asStatement(triple); + try (RepositoryConnection conn = getRepositoryConnection()) { + return conn.hasStatement(statement, includeInferred ); + } + } + + @Override + public boolean contains(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) { + Resource subj = (Resource) rdf4jTermFactory.asValue(subject); + org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate); + Value obj = rdf4jTermFactory.asValue(object); + try (RepositoryConnection conn = getRepositoryConnection()) { + return conn.hasStatement(subj, pred, obj, includeInferred); + } + } + + @Override + public void remove(Triple triple) { + Statement statement = rdf4jTermFactory.asStatement(triple); + try (RepositoryConnection conn = getRepositoryConnection()) { + conn.remove(statement); + } + } + + @Override + public void remove(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) { + Resource subj = (Resource) rdf4jTermFactory.asValue(subject); + org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate); + Value obj = rdf4jTermFactory.asValue(object); + try (RepositoryConnection conn = getRepositoryConnection()) { + conn.remove(subj, pred, obj); + } + } + + @Override + public void clear() { + try (RepositoryConnection conn = getRepositoryConnection()) { + conn.clear(); + } + } + + @Override + public long size() { + try (RepositoryConnection conn = getRepositoryConnection()) { + // FIXME: The below might contain duplicate statements across multiple contexts + return conn.size(); + } + + } + + @Override + public Stream<RDF4JTriple> stream() { + return stream(null, null, null); + } + + @Override + public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) { + Resource subj = (Resource) rdf4jTermFactory.asValue(subject); + org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate); + Value obj = rdf4jTermFactory.asValue(object); + try (RepositoryConnection conn = getRepositoryConnection()) { + // FIXME: Will the above close too early? (e.g. when returning iterator) + RepositoryResult<Statement> statements = conn.getStatements(subj, pred, obj); + return Iterations.stream(statements).map(rdf4jTermFactory::asTriple); + } + } + + private RepositoryConnection getRepositoryConnection() { + return repository.getConnection(); + } + + public Optional<Repository> asRepository() { + return Optional.of(repository); + } + + @Override + public Optional<Model> asModel() { + return Optional.empty(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java ---------------------------------------------------------------------- diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java index 74564fb..c494006 100644 --- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java +++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java @@ -11,8 +11,8 @@ import org.apache.commons.rdf.rdf4j.RDF4JTriple; import org.eclipse.rdf4j.model.Statement; public final class TripleImpl implements Triple, RDF4JTriple { - private final Statement statement; - private UUID salt; + private UUID salt; + private final Statement statement; public TripleImpl(Statement statement, UUID salt) { this.statement = statement;