Re: Type coercion to decimals?

Hi Gregg,

On 12/01/2019 20:19, Gregg Kellogg wrote:
>> On Jan 11, 2019, at 3:41 AM, Dave Reynolds <dave.e.reynolds@gmail.com> wrote:
>>
>> Hi,
>>
>> I have json data with floating point numbers which I'm trying to interpret as jsonld where the jsonld context calls for the relevant properties to be interpreted as xsd:decimal.
>>
>> In the tools I'm using, including https://json-ld.org/playground/, this is generating illegal RDF. I'm trying work out if this is a bug in the tools or whether this form of coercion is not allowed.
>>
>> A test case is:
>>
>> {
>>   "@context": {
>>     "@vocab": "http://example.com/vocab",
>>     "long": {
>>       "@id": "http://www.w3.org/2003/01/geo/wgs84_pos#long",
>>       "@type": "http://www.w3.org/2001/XMLSchema#decimal"
>>     },
>>     "lat": {
>>       "@id": "http://www.w3.org/2003/01/geo/wgs84_pos#lat",
>>       "@type": "http://www.w3.org/2001/XMLSchema#decimal"
>>     }
>>   },
>>   "@graph": [
>>     {
>>       "@id": "http://example.com/graph/1",
>>       "@graph": {
>>         "@id": "http://example.com/resource/1",
>>         "lat": 51.449604,
>>         "long": -2.601738
>>       }
>>     }
>>   ]
>> }
>>
>> Using the json-ld playground, and using Jena (which in turn depends on jsonld-java), this generates the purported n-quads:
>>
>> <http://example.com/resource/1> <http://www.w3.org/2003/01/geo/wgs84_pos#lat> "5.1449604E1"^^<http://www.w3.org/2001/XMLSchema#decimal> <http://example.com/graph/1> .
>>
>> <http://example.com/resource/1> <http://www.w3.org/2003/01/geo/wgs84_pos#long> "-2.601738E0"^^<http://www.w3.org/2001/XMLSchema#decimal> <http://example.com/graph/1> .
>>
>> The trouble is that the E notation is not legal for XSD decimals so this RDF is syntactically invalid (at least for datatype-aware processors).
>>
>> In this case I have some control over the source json so I could pass the lat/long values as strings but that would break any consumers of the json data. If I treat lat/longs as xsd:double instead of xsd:decimal that at least gets me legal RDF, just not the RDF I was looking for.
>>
>> Any thoughts on whether this is just a bug in the various tools or something deeper? Given that both jsonld-java and jsonld.js have the same behaviour I'm worried it might be deeper.
> 
> The issue stems from the JSON data model which has a single numeric type. The JSON-LD spec provides for native numbers to either be interpreted as integer or double, but not decimal, as you see. Type-casting with @type` does not work for native values. 

I was afraid of that, thanks for confirming. A shame, if it wasn't for 
the use E notation it would at least by syntactically legal.

> If you expressed the values as strings, then typecasting would work.

Yes, I noted that option above, though that means the json isn't so 
usable by non-RDF consumers.

Dave

Received on Monday, 14 January 2019 08:56:29 UTC