2015-03-16 2 views
1

Étant donné les triplets suivants:Comment fusionner des sujets RDF avec les mêmes propriétés en sommant leurs valeurs?

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 

Je voudrais fusionner des sujets avec le même nom et rire et résumer leurs valeurs, avec un résultat un peu comme:

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

Comment réaliser cela avec SPARQL avec le plus d'efficacité? (Il n'est pas nécessaire de conserver les sujets, ils peuvent être insérés tant que le nouveau avec les valeurs fusionnées partage les mêmes nameProperty et laughProperty.)

Répondre

2

Il est généralement utile de fournir des données sur lesquelles nous pouvons exécuter des requêtes. Voici des données analogues à la vôtre, mais que nous pouvons réellement travailler avec:

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

C'est un assez simple construction requête. La seule partie délicate est que depuis que nous avons besoin d'un groupe par nous devons utiliser un imbriqué sélectionnez requête afin que nous puissions utiliser la somme et échantillon fonctions d'agrégation.

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

Résultats (en N3 et N-Triples, juste pour être sûr que le 3.0e0 est en fait un 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> .