使用SPARQL CONSTRUCT进行推理

时间:2017-01-25 10:41:22

标签: sparql rdf jena protege inference

我在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类型。

我希望这个结果反映在我的图表上(我的三元组都是)。这有可能吗?有没有人处理过这种情况?

1 个答案:

答案 0 :(得分:0)

我看到两个选项。

一,运行构建推断知识的CONSTRUCT,将结果保存在文件上(例如,作为Turtle)并将它们加载到三元组中(在单独的图形中,以便您可以处理更新)。这种方法使查询具有高性能,虽然它会在您的存储后端中创建冗余而且它是静态的,您通常会定期执行此操作,并且您无法以这种方式为显式知识库中的每个小变更做事。显然,您可以在创建RDF时运行这些CONSTRUCT规则(例如,从SQL / XML / CSV转换器),这通常允许您在小型数据集上执行此操作并利用并行性。

选项二,大多数三重存储(例如,Virtuoso,Fuseki / Jena)都有规则来重写SPARQL查询并获得比没有规则时更多的结果。问题是这种方法通常不是非常高效,并且在Fuseki / Jena这样的引擎的情况下,对于大型数据集不能很好地工作,因为他们的推理引擎(作为大多数OWL reasoners)需要加载整个基础数据集在内存中,然后才能应用任何推断。