Sparql 查询中的多个计数

Multiple counts in Sparql query

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

查询应该得到A的'neighbours of neighbours'(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

是否可以合并这两个查询?谢谢!

您尝试提取的计数要求您根据 不同的事物分组。 group by 可让您指定要计算的对象。例如,当你说 select (count(?x) as ?xn) {...} group by ?y,你说的是 "how many ?x's appear per each value of ?y. The counts you're looking for are: "每个 A 有多少个 C",然后是 "how many inlinks per C"?这意味着在一种情况下,您需要 按 ?a 分组,而在另一种情况下,您需要 group by ?c。然而,在这种情况下,因为你有一个固定的 ?a,这可能会稍微容易一些。计算不同的路径 (?p1,?p2) 有点棘手,因为当你执行 count(distinct …) 时,你只能有一个表达式 。然而,你可以偷偷摸摸地计算 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
…