Ok, the operation i am trying to perform is: myMethod((Long) quad.getObject().getLiteralValue())
where the method signature is: public void myMethod(Long value); and where the initial value inserted as a typed literal was declared as xsd:long. One of the solution I have found is: myMethod(Long.parseLong(quad.getObject().getLiteralLexicalForm())) I have understood that Jena returns an Integer because the value fit into a 32 bits value but the literal was created and tagged with a xsd:Long (which is defined as a signed 64-bit integer) that's why I expect to get a Java Long when I call quad.getObject().getLiteralValue(). Even if the value can fit in a Java Integer. Laurent On Wed, Jul 20, 2011 at 2:27 PM, Andy Seaborne <[email protected]> wrote: > > > On 20/07/11 13:15, Laurent Pellegrino wrote: >> >> 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. > > because the value (-628675214) can be fitted into an Java Integer. It's > just a class choosen because it can represent the value. Ditto xsd:byte. > > > >>> 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). > > If it does not fit in 56 bits, then TDB stores the thing in the long form. > 56 bits is not a limitation on the values that can be stored - its the > limit on what can be stored compactly. If it does not fit, TDB falls back > on storing the lexical form and type. > >>> 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 :( > > You should be able to > > class Integer extends Number > Number.longValue() > > What operation are you wishing to perform? > > Andy > >>> >>> 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 >>>> >>> >
