Rdf SPARQL计数多个图中的出现次数
我正试图编写一个SPARQL查询来统计一个对象在多个图中的出现次数。样本数据和预期输出如下: 命名图g1:Rdf SPARQL计数多个图中的出现次数,rdf,sparql,Rdf,Sparql,我正试图编写一个SPARQL查询来统计一个对象在多个图中的出现次数。样本数据和预期输出如下: 命名图g1: @prefix g1: <http://example.com/g1#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . g1:ex1 rdfs:label "a" . g1:ex2 rdfs:label "a" . g1:ex3 rdfs:label "b" . g1:ex3 rdfs:label
@prefix g1: <http://example.com/g1#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
g1:ex1 rdfs:label "a" .
g1:ex2 rdfs:label "a" .
g1:ex3 rdfs:label "b" .
g1:ex3 rdfs:label "d" .
我可以通过对rdfs:labels和counting事件进行并集来获得两个图的总计数:
prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label count(?label) as ?count
{
{
GRAPH g1: {
?s rdfs:label ?label
}
} UNION {
GRAPH g2:
{
?s rdfs:label ?label
}
}
}
前缀g1:
前缀g2:
前缀rdfs:
选择?标签计数(?标签)作为?计数
{
{
图g1:{
?s rdfs:标签?标签
}
}联合{
图g2:
{
?s rdfs:标签?标签
}
}
}
我认为从这里开始,我可以使用每个联合块中的子查询来获得单个计数,但是除了这种查询可能效率低下之外,我没有得到预期的结果。您可以利用
COUNT
函数忽略未绑定的值,只为变量指定不同的名称,即
prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT (COALESCE(?label, ?label2) AS ?label) (count(?label1) as ?g1count) (count(?label2) AS ?g2count)
{
{
GRAPH g1: {
?s rdfs:label ?label1
}
} UNION {
GRAPH g2:
{
?s rdfs:label ?label2
}
}
}
前缀g1:
前缀g2:
前缀rdfs:
选择(合并(?标签,?标签2)作为标签)(计数(?标签1)作为G1计数)(计数(?标签2)作为G2计数)
{
{
图g1:{
?s rdfs:标签?标签1
}
}联合{
图g2:
{
?s rdfs:标签?标签2
}
}
}
COALESCE
函数用于将标签中的实际值合并为一个变量,因为COALESCE
返回RobV答案中参数的第一个非空值(太大,无法评论):
关闭,但这将为
标签列提供a、a、b、d、a、b、c
。有没有办法只为选择不同的值?label
?您可以尝试更改为select distinct
,但这可能无法满足您的需要,因为这会导致整行而不是整列的差异查找主题。。。非常聪明的解决方案!
prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label count(?label) as ?count
{
{
GRAPH g1: {
?s rdfs:label ?label
}
} UNION {
GRAPH g2:
{
?s rdfs:label ?label
}
}
}
prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT (COALESCE(?label, ?label2) AS ?label) (count(?label1) as ?g1count) (count(?label2) AS ?g2count)
{
{
GRAPH g1: {
?s rdfs:label ?label1
}
} UNION {
GRAPH g2:
{
?s rdfs:label ?label2
}
}
}
prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label (count(?s1) as ?g1count) (count(?s2) AS ?g2count)
{
{
GRAPH g1: {
?s1 rdfs:label ?label
}
} UNION {
GRAPH g2: {
?s2 rdfs:label ?label
}
}
} group by ?label order by ?label
---------------------
| label | g1c | g2c |
=====================
| "a" | 2 | 1 |
| "b" | 1 | 1 |
| "c" | 0 | 1 |
| "d" | 1 | 0 |
---------------------