[ https://issues.apache.org/jira/browse/JENA-1841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17051108#comment-17051108 ]
Andy Seaborne commented on JENA-1841: ------------------------------------- [~claude] -- {{createLiteral( o.toString() )}} makes it an {{xsd:string}} which is not what {{o}} is. It will not match {{"..."^^<java:java.util.UUID>}} later nor be able to reconstruct the value on parsing. Needs a datatype URI and a function string->java object. In the {{AbstractQueryBuilder.makeNode(Object)}} there simply isn't enough information to available to construct a complete RDFDatatype. No (RDF) datatype URI has been provided. So I think {{AbstractQueryBuilder.makeNode(Object)}} should be defensive and raise an exception. Better that than setting the global TypeMapper in a way that does not work later. Changing {{LiteralLabel }} constructor looks risky (it's very deep in the system) and the error message is worse. The datatype is the two way mapping between RDF representation of the literal and the Java object representation. ({{AdHocDatatype}} does not know the parsing of lexical form to value. {{BaseDatatype}} does not know the java class for an unknown datatype, nor the way to parse the lexical form. Each is incomplete for general use.) [~jmkeil] -- putting in a registration step will work for you? This seems like the correct way. The rest of this discussion is about how to create the error case of no registration. > 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)