如何在使用推断的同时提高sparql查询的性能?

如何在使用推断的同时提高sparql查询的性能?,sparql,semantic-web,virtuoso,Sparql,Semantic Web,Virtuoso,我想提高sparql查询的性能。我必须运行所有类型的sparql查询。 我在图中总共有17500000个三元组,还有一个图只包含知识。此图包含与和子类相同的属性。这个图的三元组总数约为50000000,我正在sparql查询中使用动态推断 我使用virtuoso作为数据库。它具有推断功能 当我运行带有推断的查询时,简单查询需要80秒。如果不使用推断,需要10秒 Sparql查询: DEFINE input:inference 'myrule' select DISTINCT ?uri1

我想提高sparql查询的性能。我必须运行所有类型的sparql查询。 我在图中总共有17500000个三元组,还有一个图只包含知识。此图包含与和子类相同的属性。这个图的三元组总数约为50000000,我正在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内存。 我已经对virtuoso.ini文件进行了NumberOfBuffer设置

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

如果你知道什么,请分享你的想法


谢谢你

一个500万个三元组的本体是相当大的,尽管严格来说,这没有问题。与推理相关的性能与本体的表达能力比其大小更为密切。您可以创建一个本体,它的三元组少几个数量级,这将更难进行推理

话虽如此,我没有什么具体的建议。特定于大师级的调优最好留给他们的开发人员,这样您可能会在他们的邮件列表上获得一些吸引力

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

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

最后,您可以尝试设计用于推理的其他数据库,例如或。并非所有数据库都是平等创建的,而且完全有可能您在TBox中编码了一些Virtuoso可能无法很好地处理的内容,但可以由另一个系统轻松处理。

有许多因素可能导致您描述的性能问题。最常见的是在INI文件中的NumberOfBuffers设置中出错,我们在这里看不到,因此无法诊断


专门针对演奏家的问题通常最好在、或通过。如果您把这个带到这里,我们将能够帮助您了解更多细节。

您可以尝试正确设置数字的大小,并清楚区分TBox的大小和ABox的大小。此外,在查询中定义规则时,您可能正在使用自定义推理,因此您可以解释该规则中的内容。Thanx用于您的响应,但我不知道什么是tbox和abox。如果你有一些教程或任何信息,请与我分享。我使用的是virtuoso提供的函数rdfs_rule_setrule_name、graph_name。通过这个,我们可以在sparql查询中使用rule_name。TBox是您的本体,ABox是您的数据。数据库的大小仍然格式错误。我不知道你的数据库中是否有1.75M或1.75B三元组。如果您正在使用语义技术,您应该花时间阅读RDF和OWL入门。如果您要做的不仅仅是RDFS推理,您可能还需要阅读描述逻辑手册。是的,在本体中,三元组的总数为5M,在数据中,三元组的总数为17.5M。这不是数据库大小这是三元组的总数。再次感谢您的回复。