Just to fix a mistake in my previous message : Long are 64 bits and not 128.
On Wed, Jul 20, 2011 at 2:02 PM, Laurent Pellegrino <[email protected]> wrote: > Thanks for your explanations. However, my problem is that > node.getLiteralValue() on the node returns an Integer Java object. > > DatasetGraphTDB dataset = TDBFactory.createDatasetGraph(); > > dataset.add(new Quad( > Node.createURI("http://openjena.org"), > Node.createURI("http://openjena.org"), > Node.createURI("http://openjena.org"), Node.createLiteral( > "-628675214", null, XSDDatatype.XSDlong))); > > Iterator<Quad> res = > dataset.findNG(Node.ANY, Node.ANY, Node.ANY, Node.ANY); > > Quad quad = null; > while (res.hasNext()) { > quad = res.next(); > System.out.println(quad.getObject().getLiteralValue().getClass()); > } > > dataset.close(); > > It prints: > class java.lang.Integer > > Or the problem is that I use quad.getObject().getLiteralValue() as a > parameter of a method that expects a Java Long object because the > value that was initially stored was a Long: > > myMethod((Long) quad.getObject().getLiteralValue()) > > Or I get a ClassCastException due to the fact that > quad.getObject().getLiteralValue() returns an Integer. > > Indeed, it is not possible to store a full Long (128 bits) as a typed > literal (due to the fact that numbers are encoded into 56 bits). > Hence, I have to store it as a non-typed literal and to parse it > manually but it also means that I cannot apply any method specific to > numbers on that field from a SPARQL query. That's why I was thinking > it is an issue :( > > Laurent > > On Wed, Jul 20, 2011 at 11:45 AM, Andy Seaborne > <[email protected]> wrote: >> >> >> On 19/07/11 14:56, Laurent Pellegrino wrote: >>> >>> Hi all, >>> >>> I am currently using a TDB instance with Quadruples (DatasetGraphTDB). >>> I insert some quads with a literal value which is typed with xsd:long: >>> >>> Node.createLiteral(Long.toString(myIdWhichIsAJavaLong), null, >>> XSDDatatype.XSDlong) >>> >>> At this step if I print the content to the standard output I get something >>> like: >>> "1900023546"^^http://www.w3.org/2001/XMLSchema#long >>> >>> Then, I execute a query that return the quadruples that contain the >>> literal values that were initially typed as xsd:long. When I print the >>> content to the standard output I get: >>> "1900023546"^^http://www.w3.org/2001/XMLSchema#integer >>> >>> Why does the datatype is not the same? Is it an issue? >> >> No - or at least, it shouldn't. >> >> xsd:long is a XSD 64 bit number >> xsd:integer is an arbitrary precision >> >> xsd:integer is a more general datatype than xsd:long (xsd:int is the 32 bit >> XSD integer). >> >> TDB stores numbers (integers, decimals, doubles), and dates and dateTimes >> and booleans, as their value, not as their lexical form. Actually, it >> encodes them into 56 bits (currently). If the number does not fit it is >> stores via the node table and lexical form. >> >> This saves space and makes queries involving FILTERs on values go faster. >> Much faster. >> >> See NodeId.inline(Node) >> >> Andy >> >
