我在Protégé5.1.0中建模本体。我想模拟一些东西,一旦inference-engince运行,就会推断出,在某些情况下,一个实例属于A类。
<owl:Class rdf:about="http://example.org#classA">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="http://example.org#meetsRequirements"/>
<owl:hasValue rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</owl:hasValue>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>
然而,这些“限制”并不像示例中所示的那样简单。例如,其中一个限制是“大于”的运算符,据我所知,它不能在OWL-DL中建模。 (这是正确的吗?)
在互联网上浏览,我找到了 SPARQL CONSTRUCT
类型的查询。所以,我提出了一个查询,例如:
CONSTRUCT {?ins rdf:type <http://example.org#classA}
FROM http://example.org/myBase
WHERE {?ins example:hasValue ?val}
FILTER (?val > 10^^xsd:double)}
我认为此查询应返回一个图表,其中example:hasValue > 10
的所有实例都属于ClassA
类型。
我希望这个结果反映在我的图表上(我的三元组都是)。这有可能吗?有没有人处理过这种情况?
答案 0 :(得分:0)
我看到两个选项。
一,运行构建推断知识的CONSTRUCT,将结果保存在文件上(例如,作为Turtle)并将它们加载到三元组中(在单独的图形中,以便您可以处理更新)。这种方法使查询具有高性能,虽然它会在您的存储后端中创建冗余而且它是静态的,您通常会定期执行此操作,并且您无法以这种方式为显式知识库中的每个小变更做事。显然,您可以在创建RDF时运行这些CONSTRUCT规则(例如,从SQL / XML / CSV转换器),这通常允许您在小型数据集上执行此操作并利用并行性。
选项二,大多数三重存储(例如,Virtuoso,Fuseki / Jena)都有规则来重写SPARQL查询并获得比没有规则时更多的结果。问题是这种方法通常不是非常高效,并且在Fuseki / Jena这样的引擎的情况下,对于大型数据集不能很好地工作,因为他们的推理引擎(作为大多数OWL reasoners)需要加载整个基础数据集在内存中,然后才能应用任何推断。