Sparql查询中的多个计数

时间:2015-02-27 14:45:31

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

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

查询应该得到邻居的邻居' A(A→B→C,其中A是起始节点),并且应该报告每个C,从A到C有多少路径,以及有多少" inlinks"从任何地方都有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

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

1 个答案:

答案 0 :(得分:2)

您尝试提取的计数要求您分组不同的内容。 分组依据可让您指定您想要计算的内容。例如,当您说选择(计数(?x)为?xn){...}分组按?y 时,您说“每个值有多少?x出现 。你正在寻找的计数是:“每个A有多少个C”然后“每个C有多少个链接”?这意味着在一个案例中你需要分组?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
…