Как объединить объекты RDF с одинаковыми свойствами, суммируя их значения?

Даны следующие тройки:

s1 nameProperty "Bozo"
s1 laughProperty "Haha"
s1 valueProperty "2.00"^^xml:double

s2 nameProperty "Clown"
s2 laughProperty "hehe"
s2 valueProperty "3.00"^^xml:double

s3 nameProperty "Bozo"
s3 laughProperty "Haha"
s3 valueProperty "1.00"^^xml:double

Я хотел бы объединить предметы с тем же именем, посмеяться и суммировать их значения, что-то вроде:

s1 nameProperty "Bozo"
s1 laughProperty "Haha"
s1 valueProperty "3.00"^^xml:double
s2 nameProperty "Clown"
s2 laughProperty "hehe"
s2 valueProperty "3.00"^^xml:double

Как сделать это с помощью SPARQL с наибольшей эффективностью? (Нет необходимости сохранять предметы. Их можно вставлять, если новый объект с объединенными значениями имеет те же nameProperty и laughProperty.)


person Matoe    schedule 16.03.2015    source источник


Ответы (1)


Обычно полезно, если вы предоставляете данные, по которым мы можем выполнять запросы. Вот данные, аналогичные вашим, но с которыми мы действительно можем работать:

@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix : <urn:ex:>

:s1 :nameProperty "Bozo".
:s1 :laughProperty "Haha".
:s1 :valueProperty "2.00"^^xsd:double.

:s2 :nameProperty "Clown".
:s2 :laughProperty "hehe".
:s2 :valueProperty "3.00"^^xsd:double.

:s3 :nameProperty "Bozo".
:s3 :laughProperty "Haha".
:s3 :valueProperty "1.00"^^xsd:double.

Это довольно простой запрос construct. Единственная сложность заключается в том, что, поскольку нам нужна группировка, мы должны использовать вложенный запрос select, чтобы мы могли использовать сумму и < strong>sample агрегатные функции.

prefix : <urn:ex:>

construct {
  ?clown :nameProperty ?name ;
         :laughProperty ?laugh ;
         :valueProperty ?total
}
where {
  { select (sample(?s) as ?clown) ?name ?laugh (sum(?value) as ?total) where {
      ?s :nameProperty ?name ;
         :laughProperty ?laugh ;
         :valueProperty ?value
    }
    group by ?name ?laugh }
}

Результаты (в N3 и N-Triples, просто чтобы убедиться, что 3.0e0 на самом деле является xsd:double):

@prefix :      <urn:ex:> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .

:s3     :laughProperty  "Haha" ;
        :nameProperty   "Bozo" ;
        :valueProperty  3.0e0 .

:s2     :laughProperty  "hehe" ;
        :nameProperty   "Clown" ;
        :valueProperty  "3.00"^^xsd:double .

<urn:ex:s2> <urn:ex:laughProperty> "hehe" .
<urn:ex:s2> <urn:ex:nameProperty> "Clown" .
<urn:ex:s2> <urn:ex:valueProperty> "3.00"^^<http://www.w3.org/2001/XMLSchema#double> .
<urn:ex:s3> <urn:ex:laughProperty> "Haha" .
<urn:ex:s3> <urn:ex:nameProperty> "Bozo" .
<urn:ex:s3> <urn:ex:valueProperty> "3.0e0"^^<http://www.w3.org/2001/XMLSchema#double> .
person Joshua Taylor    schedule 16.03.2015