通过 SPARQL 计算大型数据集中的属性
Count properties in a large data set via SPARQL
我想要一个 SPARQL 端点中最常用属性的列表。最直接的查询是:
select ?p ( count ( distinct * ) as ?ct )
{
?s ?p ?o.
}
group by ?p
order by desc ( ?ct )
limit 1000
问题是三元组太多(16亿个)导致服务器超时。所以,在谷歌搜索之后,我也试过这个,至少得到一个样本统计数据(是的,它是特定于 Virtuoso 的,对我来说很好):
select ?p ( count ( distinct * ) as ?ct )
{
?s ?p ?o.
FILTER ( 1 > <SHORT_OR_LONG::bif:rnd> (0.0001, ?s, ?p, ?o) )
}
group by ?p
order by desc ( ?ct )
limit 1000
但无论如何它都会超时,我猜是因为它仍然需要 group
、count
然后 order
。那么,我该怎么做呢?我可以访问 Virtuoso 关系数据库(即 iSQL),但我找不到关于 SQL 语法以及如何从 table [=] 中 select 随机三元组的文档15=].
编辑:我已经修复了查询,最初它们是错误的,感谢您的评论。上面的版本还是不行。
好的,我找到了一种方法,至少是部分方法:Virtuoso 有一个命令行管理工具,isql
。这也接受 SPARQL
查询,格式为:SPARQL <query>;
。而且它们的执行没有超时或结果大小限制。
如果您只能通过 HTTP 访问端点,这仍然不好,我不太清楚那样是否可行。
我想要一个 SPARQL 端点中最常用属性的列表。最直接的查询是:
select ?p ( count ( distinct * ) as ?ct )
{
?s ?p ?o.
}
group by ?p
order by desc ( ?ct )
limit 1000
问题是三元组太多(16亿个)导致服务器超时。所以,在谷歌搜索之后,我也试过这个,至少得到一个样本统计数据(是的,它是特定于 Virtuoso 的,对我来说很好):
select ?p ( count ( distinct * ) as ?ct )
{
?s ?p ?o.
FILTER ( 1 > <SHORT_OR_LONG::bif:rnd> (0.0001, ?s, ?p, ?o) )
}
group by ?p
order by desc ( ?ct )
limit 1000
但无论如何它都会超时,我猜是因为它仍然需要 group
、count
然后 order
。那么,我该怎么做呢?我可以访问 Virtuoso 关系数据库(即 iSQL),但我找不到关于 SQL 语法以及如何从 table [=] 中 select 随机三元组的文档15=].
编辑:我已经修复了查询,最初它们是错误的,感谢您的评论。上面的版本还是不行。
好的,我找到了一种方法,至少是部分方法:Virtuoso 有一个命令行管理工具,isql
。这也接受 SPARQL
查询,格式为:SPARQL <query>;
。而且它们的执行没有超时或结果大小限制。
如果您只能通过 HTTP 访问端点,这仍然不好,我不太清楚那样是否可行。