通过SPARQL计算大型数据集中的属性

通过SPARQL计算大型数据集中的属性,sparql,virtuoso,Sparql,Virtuoso,我想要一个SPARQL端点中最常用属性的列表。最直接的查询是: select ?p ( count ( distinct * ) as ?ct ) { ?s ?p ?o. } group by ?p order by desc ( ?ct ) limit 1000 问题是有太多的三元组(16亿)和服务器超时。所以,在谷歌搜索之后,我也尝试了这个方法,以获得至少一个样本统计数据(是的,这是一个非常专业的方法,对我来说也很好): 选择?p(计数(不同*)为?ct) { s?p?o。 过滤器(

我想要一个SPARQL端点中最常用属性的列表。最直接的查询是:

select ?p ( count ( distinct * ) as ?ct )
{
  ?s ?p ?o. 
}
group by ?p
order by desc ( ?ct )
limit 1000
问题是有太多的三元组(16亿)和服务器超时。所以,在谷歌搜索之后,我也尝试了这个方法,以获得至少一个样本统计数据(是的,这是一个非常专业的方法,对我来说也很好):

选择?p(计数(不同*)为?ct)
{
s?p?o。
过滤器(1>(0.0001,s,p,o))
}
B组?p
按描述排序(?ct)
限制1000
但无论如何它都会超时,我猜是因为它仍然需要
分组
计数
,然后
排序
。那么,我该怎么做呢?我可以访问Virtuoso关系数据库(即iSQL),但找不到有关SQL语法以及如何从表
DB.dba.rdf_quad
中选择随机三元组的文档


编辑:我已经修复了这些查询,最初它们是错误的,谢谢您的评论。上面的版本仍然不起作用。

好的,我找到了一种方法,至少是部分方法:Virtuoso有一个命令行管理工具,
isql
。它也接受
SPARQL
查询,形式为:
SPARQL。它们的执行没有超时或结果大小限制


如果您只能通过HTTP访问端点,这仍然不太好,我不太清楚这种方式是否可行。

旁注:我认为查询并不能统计最常用的属性,您应该删除distinct,否则每个组都会将数字1作为count.Yep或count?s或?o,但同样没有distinct。抱歉,我弄乱了太多打开的窗口,现在我已经修复了查询,但它们还不能工作。1。您愿意尝试对virtuoso.ini文件进行一些优化吗?2.您是否通过网络(如通过web浏览器)发出查询?i、 例如,您是否可以登录到virtuoso服务器的外壳并将查询提交给localhost,例如使用cURL?正如@MarkMiller已经说过的那样。查询本身没有改进的余地。其他一切都取决于triple store的性能,而triple store实际上是基于它所部署的硬件。一些限制影响通过HTML进行交互,但不影响通过iSQL、ODBC、JDBC或其他机制进行交互;其他限制会影响所有交互。如果Virtuoso实例是您自己的,您可以调整配置以优化性能,并调整限制,使其不会影响您的查询。这里是一个很好的提问高手的地方。谢谢@TallTed,我在某个地方读到有这些配置选项,我想我会更改它们,但我不知道如何简单地列出属性及其用法,这不会花费太长时间。也许三联书店应该引入一些统计图表,在飞机上可以得到这些东西。这不是一个进行此类对话的好地方,但一个关键的细节是——你为什么想要这些统计数据?目的、目标和最终结果是什么…我认为它们可能有多种用途。例如,-告诉用户/利益相关者您在知识库中拥有什么(以及它是如何增长的)-评估应用程序所需的资源(例如,内存/节点/分析数据的时间)-反向工程数据集以在其上构建适当的本体(我的当前案例)。您可能会发现一个有趣的阅读。
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