2011-02-18 31 views
9

您好我有一個像這樣的查詢:Sparql:變量之間的算術運算符?

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

我怎樣可以把第一nuber和第二? idealy財產以後這樣的:

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

謝謝

回答

12

在SPARQL 1.1,你可以使用像這樣項目的表達式做到這一點:

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 
} 

您可以交替使用xsd:double(?var)投給了一倍,xsd:integer(?var)將其轉換爲整數並且xsd:decimal(?var)轉換爲小數。

注意SPARQL指定類型的促銷規則,例如:

  • 整數/整數=小數
  • 浮點/雙精度=雙

如果你真正需要的結果保證數據類型你可以將整個分隔表達式例如

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

有實現這一目標有兩種方式:

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

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