我想提高sparql查询的性能。我必须运行所有类型的sparql查询。我在这个图中总共有17,500,000个三元组,我还有其他只包含知识的图。此图包含same 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。并且我已经完成了virtuoso.ini文件的NumberOfBuffer设置。
我不知道推理有什么问题。但是我必须在sparql查询中使用推理。
如果你知道什么,请分享你的想法。
谢谢
发布于 2012-10-22 08:29:49
一个五百万个三元组的本体是相当大的,尽管严格地说,这不是问题。与推理相关的性能与本体的表达能力密切相关,而不是它的大小。您可以创建一个具有几个数量级、较少的三元组的本体,这将更难进行推理。
话虽如此,但我并没有什么特别的建议。Virtuoso的特定调优最好留给他们的开发人员,所以你可能会在他们的邮件列表中获得一些吸引力。
看起来您使用了一些自定义推理"my_rule“--尽管在注释中您还声明了RDFS & sameAs。您可能需要弄清楚您实际使用的推理,您的本体落入的概要(RDFS或OWL2 QL,RL,EL,DL),并了解推理的实际工作原理。此外,等式推理很困难,您声称除了RDFS之外还在使用它。Virtuoso可能会急于计算等价关系,这可能会减少查询的开销,但同样,这也是您应该在他们的邮件列表中处理的事情。
推理无论如何都不容易,除了使用更简单的本体或更少的数据,或者两者兼而有之之外,没有什么灵丹妙药可以让推理变得更快。
最后,您可以尝试其他专为推理而设计的数据库,例如OWLIM或Stardog。并不是所有的数据库都是平等的,你完全有可能在你的TBox中编码了一些Virtuoso可能不能很好处理的东西,但可以很容易地被另一个系统处理。
发布于 2012-11-06 05:26:28
有许多因素可能导致您所描述的性能问题。最常见的情况是在INI文件中的NumberOfBuffers设置中出现错误--我们在这里看不到这个错误,因此无法对其进行诊断。
特别是关于Virtuoso的问题通常最好在public OpenLink Discussion Forums、Virtuso Users mailing list或confidential Support Case上提出。如果你把这个带到那里,我们应该能够更详细地帮助你。
https://stackoverflow.com/questions/12820873
复制相似问题