[
https://issues.apache.org/jira/browse/COMMONSRDF-55?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15854179#comment-15854179
]
ASF GitHub Bot commented on COMMONSRDF-55:
------------------------------------------
Github user stain commented on the issue:
https://github.com/apache/commons-rdf/pull/32
I guess it's a question of where we put the "inconsistency" barrier. We can
probably assume that in the odd case that `urn:x-arq:DefaultGraph` appear
literally in a non-Jena `IRI` or a non-Jena `Quad` then it must have leaked out
of Jena somehow, and will be treated as a real IRI. It would magically become
the default graph only if such a quad is added to a Jena dataset.
That would mean we let Commons RDF construction by component of a
Jena-based quad preserve `g` just as in other implementations.
With option **(2)** above we would add JenaRDF-specific recognition of the
magic IRI if it happens to be backed by a Jena `Node` (which might even be
because it was made from a string).
It would probably cleaner in Commons RDF for a Quad to magically change
only on insertion to a Jena-backed Dataset, than when making the Quad with a
particular back-end - e.g. you add one quad, but a slightly different one comes
back out, which will not be `.equals()` the inserted one. This is not very
different from stores with inferred rules or blank-node adaptions. (Commons
RDF Graph/Dataset contracts do not require the exact triple/quad to be returned
back again)
So I think that would be the semantically cleanest solution, where each
`RDF` implementation behaves the same, but each `Dataset` have slight variation.
However, it is not given that a `Quad` made with `JenaRDF` will be added to
a Jena-based `Dataset`, but that is probably most likely. It is not given that
a `Node` that is `urn:x-arq:DefaultGraph` was picked from the constant
`Node.defaultNode`, but it is likely. It is not given that a literal Graph IRI
`urn:x-arq:DefaultGraph` has leaked from Jena's `Node.defaultNode, but it is
likely.
Therefore the most pragmatic for Commons RDF users, if semantically
slightly unclean, would be the option (2) as @ajs6f says. It means there would
be only this inconsistency barrier:
```java
RDF simple = new SimpleRDF();
RDF jena = new JenaRDF();
IRI defaultS = simple.createIRI("urn:x-arq:DefaultGraph")
IRI defaultJ = jena.createIRI("urn:x-arq:DefaultGraph") // or
jena.asRDFTerm(Node.defaultGraph)
assertEquals(defaultS, defaultJ);
IRI ex = jena.createIRI("http://example.com/");
Quad q1 = jena.createQuad(defaultS, ex, ex, ex);
assertFalse(q1.getGraphName().isPresent());
assertEquals(defaultS, q1.getGraphName().get()); // as-s
Quad q2 = jena.createQuad(defaultJ, ex, ex, ex);
assertFalse(q2.getGraphName().isPresent()); // INCONSISTENT with q1
assertFalse(q1.equals(q2)); // INCONSISTENT
```
(Adding either `q1` or `q2` to a Jena-backed Dataset would both be
transferred to q2-form with `Optional.empty()` on retrieving -- adding them to
any non-Jena Dataset implementation would look like two different quads).
This will technically break the [SHOULD
contract](https://github.com/apache/commons-rdf/blob/0.3.0-incubating/api/src/main/java/org/apache/commons/rdf/api/RDF.java#L234)
of `RDF.createQuad()` which says the parameters should be preserved.
> * The returned Quad SHOULD have a {@link Quad#getGraphName()} that
is equal
> * to the provided graphName, a {@link Quad#getSubject()} that is
equal to
> * the provided subject, a {@link Quad#getPredicate()} that is equal
to the
> * provided predicate, and a {@link Quad#getObject()} that is equal to
the
> * provided object.
but I think this is a valid breaking of SHOULD, particularly if we do it
only on "our own" Jena-backed IRIs.
> Stream of Jena quads use wrong IRI for default graph
> ----------------------------------------------------
>
> Key: COMMONSRDF-55
> URL: https://issues.apache.org/jira/browse/COMMONSRDF-55
> Project: Apache Commons RDF
> Issue Type: Bug
> Components: jena
> Affects Versions: 0.3.0
> Reporter: Stian Soiland-Reyes
> Assignee: Stian Soiland-Reyes
> Fix For: 1.0.0
>
>
> See https://travis-ci.org/apache/commons-rdf/builds/195548479
> {code}
> org.apache.commons.rdf.jena.DatasetJenaTest
> streamLanguageTagsCaseInsensitive(org.apache.commons.rdf.jena.DatasetJenaTest)
> Time elapsed: 0.012 sec <<< FAILURE!
> java.lang.AssertionError: expected:<<http://example.com/s1>
> <http://example.com/greeting> "Hello"@EN-GB <urn:x-arq:DefaultGraph>.> but
> was:<<http://example.com/s1> <http://example.com/greeting> "Hello"@en-GB .>
> {code}
> Jena uses the IRI `<urn:x-arq:DefaultGraph>` internally to represent the
> default graph within datasets - we need to recognize that on the way out of a
> `JenaDatasetImpl.stream()` and possibly in the `asQuad(JenaQuad)` converter
> and replace it with `Optional.empty()` so the default graph appears the same
> across implementations.
> The `AbstractDatasetTest` should be augmented to do more tests on the
> default graph, including `.stream()`, `.iterate()`, `.contains()` and
> `.remove()`1.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)