我想创建一个包含两个计数的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
是否可以将这两个查询结合起来?谢谢!
答案 0 :(得分:2)
您尝试提取的计数要求您分组不同的内容。 分组依据可让您指定您想要计算的内容。例如,当您说选择(计数(?x)为?xn){...}分组按?y 时,您说“每个值有多少?x出现
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
…