Rdf SPARQL计数多个图中的出现次数

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

我正试图编写一个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 "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   |
---------------------