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
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
…
我想创建一个包含两个计数的 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
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
…