GRValidator Implemented E20

Error 20

E20: Check that all xsd:float values (in particular those attachedto gr:QuantitativeValueFloat and all price info) is compliant with the xsd:float spec.

Validator Tool: Step # 32

Error Message

Float values must be compliant with the xsd:float spec. Particulary, float values should contain only digits (no currency characters etc.) and not thousand separators (comma) and at max one dot. So "$2,019.60" is incorrect. e or E for exponents would be allowed if preceded and followed by digits. So "1234.4E07" is valid.

Potential Problem

Care must be taken that all xsd:float acomplish to the xsd specification. In particular that it contains only digits (no currencycharacters etc.) and not thousand separators (comma) and at max one dot.So ""$2,019.60"" is incorrect. e or E for exponents would be allowed ifpreceded and followed by digits "1234.4E07" is valid.

Examples of Wrong Data

@prefix gr: <http://purl.org/goodrelations/v1#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix toy: <http://www.heppnetz.de/ontologies/examples/toy#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://www.heppnetz.de/ontologies/examples/gr> rdf:type owl:Ontology ;
    owl:imports <http://www.heppnetz.de/ontologies/examples/toy> ,
        <http://purl.org/goodrelations/v1> .
<http://www.heppnetz.de/ontologies/examples/gr#Offering_1> rdf:type gr:Offering .
<http://www.heppnetz.de/ontologies/examples/gr#UnitPriceSpecification_1> rdf:type gr:UnitPriceSpecification ;
    gr:hasCurrencyValue "178,000.12e17"^^<http://www.w3.org/2001/XMLSchema#float> .
<http://www.heppnetz.de/ontologies/examples/gr#Offering_1> gr:hasPriceSpecification
<http://www.heppnetz.de/ontologies/examples/gr#UnitPriceSpecification_1> .

SPARQL Query

PREFIX gr:<http://purl.org/goodrelations/v1#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
#Datatype properties: Float type

SELECT *
WHERE {
# 1. amountOfThisGood
  {
    ?object a gr:TypeAndQuantityNode .
    ?object gr:amountOfThisGood ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 7. hasCurrencyValue
  UNION { #PriceSpecification
    ?object a gr:PriceSpecification .
    ?object gr:hasCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #UnitPriceSpecification
    ?object a gr:UnitPriceSpecification .
    ?object gr:hasCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #PaymentChargeSpecification
    ?object a gr:PaymentChargeSpecification .
    ?object gr:hasCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #DeliveryChargeSpecification
    ?object a gr:DeliveryChargeSpecification .
    ?object gr:hasCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 13. hasMaxCurrencyValue
  UNION { #PriceSpecification
    ?object a gr:PriceSpecification .
    ?object gr:hasMaxCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #UnitPriceSpecification
    ?object a gr:UnitPriceSpecification .
    ?object gr:hasMaxCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #PaymentChargeSpecification
    ?object a gr:PaymentChargeSpecification .
    ?object gr:hasMaxCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #DeliveryChargeSpecification
    ?object a gr:DeliveryChargeSpecification .
    ?object gr:hasMaxCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 15. hasMaxValueFloat
  UNION {
    ?object a gr:QuantitativeValueFloat .
    ?object gr:hasMaxValueFloat ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 17. hasMinCurrencyValue
  UNION { #PriceSpecification
    ?object a gr:PriceSpecification .
    ?object gr:hasMinCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #UnitPriceSpecification
    ?object a gr:UnitPriceSpecification .
    ?object gr:hasMinCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #PaymentChargeSpecification
    ?object a gr:PaymentChargeSpecification .
    ?object gr:hasMinCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  } UNION { #DeliveryChargeSpecification
    ?object a gr:DeliveryChargeSpecification .
    ?object gr:hasMinCurrencyValue ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 19. hasMinValueFloat
  UNION {
    ?object a gr:QuantitativeValueFloat .
    ?object gr:hasMinValueFloat ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
# 24. hasValueFloat
  UNION {
    ?object a gr:QuantitativeValueFloat .
    ?object gr:hasValueFloat ?number .
    FILTER (
      ( datatype(?number) != xsd:float )
      || (
        !regex(str(?number), "^[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+$")
        && !regex(str(?number), "^[0-9]+[eE][+-]?[0-9]+$")
        && !regex(str(?number), "^[0-9]+.[0-9]+[eE][+-]?[0-9]+$")
      )
    )
  }
}