【问题标题】:SPARQL counting occurrences in multiple graphsSPARQL 计数多个图中的出现次数
【发布时间】:2013-01-21 16:30:40
【问题描述】:

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

命名图g2:

@prefix g2: <http://example.com/g2#> .    
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
g2:ex1 rdfs:label "a" .
g2:ex2 rdfs:label "b" .
g2:ex3 rdfs:label "c" .

SPARQL 查询的预期输出:

?label ?g1count ?g2count
a      2        1
b      1        1
c      0        1
d      1        0

我可以通过合并 rdfs:labels 并计算出现次数来获得两个图的总数:

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

我认为从这里我可以使用每个 UNION 块中的子查询来获取单独的计数,但除了这种查询可能效率低下之外,我还没有获得预期结果的运气。

【问题讨论】:

    标签: rdf sparql


    【解决方案1】:

    从 RobV 的回答中打高尔夫球(评论太大):

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

    【讨论】:

    • 计算主题...非常聪明的解决方案!
    【解决方案2】:

    您可以利用 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
        }
      }
    }
    

    COALESCE 函数用于将标签中的实际值组合成单个变量,因为 COALESCE 从参数中返回第一个非空值

    【讨论】:

    • 关闭,但这给了我a,a,b,d,a,b,c ?label 列。有没有办法只为?label 选择不同的值?
    • 您可以尝试更改为SELECT DISTINCT,但这可能无法满足您的需求,因为它会在整行而不是列上实现独特性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多