2011-02-18 8 views
9

Hola tengo una consulta como esta:Sparql: operadores aritméticos entre variables?

SELECT ?a ?b 
WHERE 
{ 
?c property:name "myThing"@en 
?c property:firstValue ?b 
?c property:secondValue ?a 
} 

Como puedo dividir la primera y la segunda nuber? idealmente algo como esto:

SELECT ?a/?b 
WHERE 
{ 
?c property:name "myThing"@en 
?c property:firstValue ?b 
?c property:secondValue ?a 
} 

Gracias

Respuesta

12

En SPARQL 1.1 que puede hacerlo utilizando expresiones del proyecto, así:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
SELECT (xsd:float(?a)/xsd:float(?b) AS ?result) 
WHERE 
{ 
?c property:name "myThing"@en 
?c property:firstValue ?b 
?c property:secondValue ?a 
} 

Es posible utilizar alternativamente xsd:double(?var) para echar a un doble, xsd:integer(?var) para convertir a un número entero y xsd:decimal(?var) para convertir a decimal.

Tenga en cuenta que SPARQL especifica las reglas de promoción tipo así por ejemplo:

  • número entero/entero = decimal
  • flotador/doble = doble

Si realmente necesita el resultado en un tipo de datos garantizada puedes lanzar la expresión de división completa, por ej.

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
SELECT (xsd:double(xsd:float(?a)/xsd:float(?b)) AS ?result) 
WHERE 
{ 
?c property:name "myThing"@en 
?c property:firstValue ?b 
?c property:secondValue ?a 
} 
5

Hay dos maneras de lograr esto:

SELECT ((?a/?b) AS ?result) WHERE { 
    ?c property:name "myThing"@en . 
    ?c property:firstValue ?b . 
    ?c property:secondValue ?a . 
} 

o

SELECT ?result WHERE { 
    BIND((?a/?b) AS ?result) . 
    ?c property:name "myThing"@en . 
    ?c property:firstValue ?b . 
    ?c property:secondValue ?a . 
}