【问题标题】:Multiple counts in Sparql querySparql 查询中的多个计数
【发布时间】:2015-02-27 14:45:30
【问题描述】:

我想创建一个包含两个计数的 Sparql 查询。

查询应该获得 A 的“邻居的邻居”(A → B → C,其中 A 是起始节点),并且应该报告每个 C,从 A 到 C 有多少条路径,以及从任何地方到 C 有多少“链接”。结果集应该如下:

C | #C |  C_INLINKS
--------------------------
A | 2  | 123
B | 3  | 234

其中 #C 是从起始节点 A 到 C 的路径数。

我可以单独创建计数,但我不知道如何组合这些:

Count neighbours of neighbours:

select ?c count(?c) as ?countc WHERE {
   <http://dbpedia.org/resource/AFC_Ajax> ?p1 ?b.
   ?b ?p2 ?c.
   FILTER (regex(str(?c), '^http://dbpedia.org/resource/'))
}
GROUP BY ?c
ORDER BY DESC(?countc)
LIMIT 100

Count inlinks to neighbours of neigbours

select ?c count(?inlink) as ?inlinks WHERE {
   <http://dbpedia.org/resource/AFC_Ajax> ?p1 ?b.
   ?b ?p2 ?c.
   ?inlink ?p3 ?c
   FILTER (regex(str(?c), '^http://dbpedia.org/resource/'))
}
GROUP BY ?c
ORDER BY DESC(?inlinks)
LIMIT 100

是否可以将这两个查询结合起来?谢谢!

【问题讨论】:

    标签: rdf sparql semantic-web dbpedia linked-data


    【解决方案1】:

    您尝试提取的计数要求您不同的事物分组。 group by 可让您指定要计算的对象。例如,当您说 select (count(?x) as ?xn) {...} group by ?y 时,您是在说“每个值有多少个 ?x 出现 ? ?a,而在另一种情况下,您需要按 ?c 分组。但是,在这种情况下,由于您有一个固定的 ?a , 这可能会更容易一些。计算不同的路径 (?p1,?p2) 有点棘手,因为当你做 count(distinct ...) 时,你只能有一个... 的表达式。但是,您可以通过计算不同的 concat(str(?p1),str(?p2)) 来偷偷摸摸,这是一个单一的表达式,应该对于每个 ?p1 ?p2 对都是唯一的。然后我想你会寻找这样的查询:

    select ?c
           (count(distinct concat(str(?p1),str(?b),str(?p2))) as ?n_paths)
           (count(distinct ?inlink) as ?n_inlink)
    where {
      dbpedia:AFC_Ajax ?p1 ?b . ?b ?p2 ?c .
      ?inlink ?p ?c
      filter strstarts(str(?c),str(dbpedia:))
    }
    group by ?c
    

    SPARQL results

    c                                                           n_paths n_inlink
    ----------------------------------------------------------------------------
    http://dbpedia.org/resource/AFC_Ajax                        32      540
    http://dbpedia.org/resource/Category:AFC_Ajax_players       17      484
    http://dbpedia.org/resource/Category:Living_people          17      659447
    http://dbpedia.org/resource/Category:Eredivisie_players     13      2232
    http://dbpedia.org/resource/Category:Dutch_footballers      12      2141
    http://dbpedia.org/resource/Category:1994_births             6      3605
    …
    

    【讨论】:

    • 嗨,我感觉它仍然没有返回正确的值。例如,使用 select distinct ?p1,?b,?p2 where { dbpedia:AFC_Ajax ?p1 ?b 。 ?b ?p2 dbpedia.org/resource/Category:AFC_Ajax_players> } 我发现 AFC_Ajax 和 Category:AFC_Ajax_players 之间有 57 条路径。但是您的查询给出了 17。我不明白为什么这些数字不同。你知道这里出了什么问题吗?谢谢!
    • @user1255553 嗯……我去看看
    • 似乎如果我删除一个“count()”,其他 count() 值也会发生变化,但这没有意义吧?因为这些值是按 ?c 分组的。
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多