Sparql: Арифметические операторы между переменными? - PullRequest
9 голосов
/ 18 февраля 2011

Привет, у меня такой запрос:

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

Как я могу разделить первое число и второе? В идеале что-то вроде этого:

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

Спасибо

Ответы [ 2 ]

12 голосов
/ 19 февраля 2011

В SPARQL 1.1 вы можете сделать это, используя выражения Project, например:

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 определяет правила продвижения типов, например:

  • целое число / целое число = десятичное число
  • float / double = double

Если вам действительно нужен результат с гарантированным типом данных, вы можете привести все выражение деления, например,

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 голосов
/ 18 января 2014

Для этого есть два способа:

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 .
}
...