如何合并具有相同属性的 RDF 主题求和它们的值?
How to merge RDF subjects with same properties summing their values?
给定以下三元组:
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
,就可以插入它们。)
如果您提供我们实际上可以 运行 查询的数据,通常会很有帮助。这是类似于您的数据,但我们可以实际使用:
@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 查询。唯一棘手的部分是因为我们需要 group by 我们必须使用嵌套的 select 查询以便我们可以使用sum 和 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> .
给定以下三元组:
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
,就可以插入它们。)
如果您提供我们实际上可以 运行 查询的数据,通常会很有帮助。这是类似于您的数据,但我们可以实际使用:
@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 查询。唯一棘手的部分是因为我们需要 group by 我们必须使用嵌套的 select 查询以便我们可以使用sum 和 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> .