使用最多谓词计算DBPedia资源

时间:2014-03-13 22:02:23

标签: rdf sparql dbpedia

我认为向DBPedia询问哪些资源是最具谓词丰富的内容会很有趣。

我尝试运行以下查询:

SELECT DISTINCT ?s (count(?p) AS ?info)
WHERE {
  ?s ?p ?o .
}
GROUP BY ?s ?p
ORDER BY desc(?info)
LIMIT 50

它超时了,所以我无法验证它是否是正确的查询。

所以,我留下了以下两个问题:

  1. 这是问这个问题的正确方法吗?
  2. 查询的计算成本太高(即使在较小的数据集上?DBP是2.46b三倍)?

1 个答案:

答案 0 :(得分:3)

问这个的正确方法

假设你有这样的数据:

@prefix : <http://stackoverflow.com/q/22391927/1281433/> .

:a :p 1, 2, 3 ;
   :q 4, 5 .

:b :p 1, 2 ;
   :q 3, 4 ;
   :r 5, 6 .

:c :p 1 ;
   :q 2 ;
   :r 3 .

然后你可以通过这样的查询询问每个资源有多少三元组:

prefix : <http://stackoverflow.com/q/22391927/1281433/>

select ?s (count(*) as ?n) where {
  ?s ?p ?o
}
group by ?s
order by desc(?n)
----------
| s  | n |
==========
| :b | 6 |
| :a | 5 |
| :c | 3 |
----------

请注意,如果您对每个资源的主题数量感兴趣,您只想group by ?s。在原始查询中,您group by ?s ?p,您将根据它们具有的值来排序(主题,谓词)对。例如,

prefix : <http://stackoverflow.com/q/22391927/1281433/>

select ?s ?p (count(*) as ?n) where {
  ?s ?p ?o
}
group by ?s ?p
order by desc(?n)
---------------
| s  | p  | n |
===============
| :a | :p | 3 |
| :b | :p | 2 |
| :a | :q | 2 |
| :b | :q | 2 |
| :b | :r | 2 |
| :c | :p | 1 |
| :c | :q | 1 |
| :c | :r | 1 |
---------------

为DBpedia执行此操作

我不希望你能在DBpedia上运行这样的查询。它需要触摸数据中的每个三元组,然后按照它们所涉及的三元组来排序资源。这听起来像是很多工作。您可以下载数据,将其加载到本地端点并运行查询,从而避免超时,但如果仍需要一段时间,我不会感到惊讶。