2

我想提高我的 sparql 查询的性能。我必须运行所有类型的 sparql 查询。我在图中总共有 17,500,000 个三元组,并且我还有其他仅包含知识的图。该图包含相同的 as 和 subclassOf 属性。该图的总三倍数约为 50,000,000,我在 sparql 查询中使用动态推理。

我正在使用 virtuoso 作为数据库。它具有推理功能。

当我使用推理运行查询时,简单查询需要 80 秒。在不使用推理的情况下,它需要 10 秒。

Sparql 查询:

 DEFINE input:inference 'myrule' 
 select DISTINCT  ?uri1  ?uri2  
 from <GRAPH_NAME>  
 where {?uri1   rdf:type ezdi:Aspirin. 
 ?patient ezdi:is_treated_with ?uri1. 
 ?patient rdf:type ezdi:Patient. 
 ?uri2 rdf:type ezdi:Hypertension .
 ?patient ezdi:is_suffering_with ?uri2. 
 ?patient rdf:type ezdi:Patient  } ORDER BY ?patient

我已经完成了大师提供的所有索引。系统有 32 GB RAM。而且我已经完成了 NumberOfBuffer 设置 virtuoso.ini 文件。

我不知道推理有什么问题。但我必须在 sparql 查询中使用推理。

如果你知道一些事情,那么请分享你的想法。

谢谢你

4

2 回答 2

3

一个 5M 三元组的本体是相当大的,虽然严格来说,这不是问题。与推理有关的性能与本体的表达能力比它的大小更紧密地联系在一起。您可以创建一个具有几个数量级的三元组的本体,这将难以推理。

话虽如此,我没有什么特别建议的。Virtuoso 特定的调优最好留给他们的开发人员,因此您可能会在他们的邮件列表中获得一些牵引力。

您似乎正在使用一些自定义推理“my_rule”——尽管在评论中您还声称 RDFS 和 sameAs。你可能需要弄清楚你实际使用的是什么推理,你的本体属于什么配置文件(RDFS 或 OWL2 QL、RL、EL、DL),并了解一些关于推理的实际工作原理。此外,等式推理很困难,您声称除了 RDFS 之外还使用了它。Virtuoso 可能会急切地计算等价关系,这可以减少查询的开销,但同样,您应该在他们的邮件列表中处理这些问题。

推理无论如何都不容易,除了使用更简单的(即表达性较差的)本体或更少的数据或两者兼而有之之外,没有任何灵丹妙药可以神奇地加快推理速度。

最后,您可以尝试其他为推理而设计的数据库,例如OWLIMStardog。并非所有的数据库都是一样的,完全有可能你在你的 TBox 中编码了一些 Virtuoso 可能无法很好处理的东西,但可以被另一个系统轻松处理。

于 2012-10-22T00:29:49.233 回答
2

There are many factors which could lead to the performance issue you describe. The most common is to make an error in the NumberOfBuffers setting in the INI file -- which we cannot see, and so cannot diagnose, here.

Questions specifically regarding Virtuoso are generally best raised on the public OpenLink Discussion Forums, the Virtuso Users mailing list, or through a confidential Support Case. If you bring this there, we should be able to help you in more detail.

于 2012-11-05T21:26:28.450 回答