[ https://issues.apache.org/jira/browse/JENA-1841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17050973#comment-17050973 ]
Jan Martin Keil edited comment on JENA-1841 at 3/4/20, 7:58 AM: ---------------------------------------------------------------- {quote}Would it make sense that rather than throw an exception just call createLiteral( o.toString() ); ? {quote} I would expect the library to throw some proper Exception, instead of doing some hidden magic that might fit most developers needs. If I did understand it right, using {{createLiteral( o.toString() );}} further has the disadvantage that it might fall back to {{Object#toString()}} for other classes. In this case it will only give the class name and hash, which is worthless in an RDF document or SPARQL query. For broader class support out of the box, one could make use of the {{Serializable}} interface. The result, however, is not a nice representation to use in RDF. {quote}Finally - did the code mean to use a URI: <urn:uuid:00000000-0000-0000-0000-000000000007>? {quote} No. was (Author: jmkeil): {quote}Would it make sense that rather than throw an exception just call createLiteral( o.toString() ); ? {quote} I would expect the library to throw some proper Exception, instead of doing some hidden magic that might fit most developers needs. If I did understand it right, using {{createLiteral( o.toString() );}} further has the disadvantage that it might fall back to {{Object#toString()}} for other classes. In this case it will only give the class name and hash, which is worthless in an RDF document or SPARQL query. For broader class support out of the box, one could make use of the {{Serializable}} interface. The result, however is not a nice representation to use in RDF. {quote}Finally - did the code mean to use a URI: <urn:uuid:00000000-0000-0000-0000-000000000007>? {quote} No. > Side Effect of Datatype <java:java.util.UUID> Use in Query > ---------------------------------------------------------- > > Key: JENA-1841 > URL: https://issues.apache.org/jira/browse/JENA-1841 > Project: Apache Jena > Issue Type: Bug > Affects Versions: Jena 3.14.0 > Reporter: Jan Martin Keil > Priority: Major > > I faced a bug caused by a side effect of using the datatype > <java:java.util.UUID> in a query. > Short story is that you can not use this datatype in model parsing or queries > after you once used it in a query. > I did not completely break it down to a specific piece of code, but I wrote > some testcases that narrow down the issue. Please note that the order of > execution of the test methods effect the result. So please first try to > execute single test methods before executing the whole test class. > {code:java} > import java.io.ByteArrayInputStream; > import java.util.UUID; > import org.apache.jena.arq.querybuilder.SelectBuilder; > import org.apache.jena.query.QueryExecution; > import org.apache.jena.query.QueryExecutionFactory; > import org.apache.jena.rdf.model.Model; > import org.apache.jena.rdf.model.ModelFactory; > import org.junit.jupiter.api.Test; > public class UuidParsingintoModelOrQuery { > @Test > public void uuidParsingIntoSingleModel() throws Exception { > UUID uuid1 = > UUID.fromString("00000000-0000-0000-0000-000000000000"); > UUID uuid2 = > UUID.fromString("00000000-0000-0000-0000-000000000001"); > String modelStr = "_:a <http://example.org/p1> \"" + uuid1 + > "\"^^<java:java.util.UUID> .\n" > + "_:a <http://example.org/p2> \"" + uuid1 + > "\"^^<java:java.util.UUID> ."; > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > // repeat > modelStr = "_:a <http://example.org/p1> \"" + uuid2 + > "\"^^<java:java.util.UUID> .\n" > + "_:a <http://example.org/p2> \"" + uuid2 + > "\"^^<java:java.util.UUID> ."; > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > } > @Test > public void sameUuidParsingIntoSingleModel() throws Exception { > UUID uuid1 = > UUID.fromString("00000000-0000-0000-0000-000000000002"); > UUID uuid2 = > UUID.fromString("00000000-0000-0000-0000-000000000003"); > String modelStr = "_:a <http://example.org/p1> \"" + uuid1 + > "\"^^<java:java.util.UUID> .\n" > + "_:a <http://example.org/p2> \"" + uuid2 + > "\"^^<java:java.util.UUID> ."; > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > // repeat > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > } > @Test > public void sameUuidParsingIntoMultipleModel() throws Exception { > UUID uuid = > UUID.fromString("00000000-0000-0000-0000-000000000004"); > String modelStr = "_:a <http://example.org/p1> \"" + uuid + > "\"^^<java:java.util.UUID> ."; > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE"); > } > @Test > public void uuidUseInQuery() throws Exception { > UUID uuid = > UUID.fromString("00000000-0000-0000-0000-000000000005"); > SelectBuilder select = new SelectBuilder(); > select.addWhere("?a", "<http://example.org/p>", "?uuid"); > select.addFilter(select.getExprFactory().eq("?uuid", uuid)); > QueryExecution q = QueryExecutionFactory.create(select.build()); > } > @Test > public void uuidParsingIntoQuery() throws Exception { > UUID uuid = > UUID.fromString("00000000-0000-0000-0000-000000000006"); > SelectBuilder select = new SelectBuilder(); > select.addWhere("?a", "<http://example.org/p>", "?uuid"); > select.addFilter(select.getExprFactory().eq("?uuid", uuid)); > QueryExecution q = > QueryExecutionFactory.create(select.toString()); > } > @Test > public void uuidUseInQueryAndParsingIntoModel() throws Exception { > UUID uuid = > UUID.fromString("00000000-0000-0000-0000-000000000007"); > SelectBuilder select = new SelectBuilder(); > select.addWhere("?a", "<http://example.org/p>", "?uuid"); > select.addFilter(select.getExprFactory().eq("?uuid", uuid)); > QueryExecution q = QueryExecutionFactory.create(select.build()); > String modelStr = "_:a <http://example.org/p1> \"" + uuid + > "\"^^<java:java.util.UUID> .\n" > + "_:a <http://example.org/p2> \"" + uuid + > "\"^^<java:java.util.UUID> ."; > Model model = ModelFactory.createDefaultModel().read(new > ByteArrayInputStream(modelStr.getBytes()), "", > "N-TRIPLE"); > } > } > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)