【问题标题】:How to query an individual for its object property from an OWL RDF/XML using SWI-Prolog?如何使用 SWI-Prolog 从 OWL RDF/XML 查询个人的对象属性?
【发布时间】:2017-08-16 00:34:13
【问题描述】:

我在 Protege 中指定了一个“isPartOf”对象属性,并断言

“Room_1 是 Apartment_1 的一部分”。

“Room_1”和“Apartment_1”都是个人。 OWL文件中的相关代码如下:

<rdf:RDF xmlns="http://www.xxx.come/example#"
 xml:base="http://www.xxx.come/example"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:owl="http://www.w3.org/2002/07/owl#"
 xmlns:xml="http://www.w3.org/XML/1998/namespace"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">


<!-- http://www.xxx.come/example#isPartOf -->

<owl:ObjectProperty rdf:about="http://www.xxx.come/example#isTemporalPartOf">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AsymmetricProperty"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ReflexiveProperty"/>
    <rdfs:domain rdf:resource="http://www.xxx.come/example#Room"/>
    <rdfs:range rdf:resource="http://www.xxx.come/example#Apartment"/>
</owl:ObjectProperty>


<!-- http://www.xxx.come/example#Room_1 -->

<owl:NamedIndividual rdf:about="http://www.xxx.come/example#Room_1">
    <rdf:type rdf:resource="http://www.xxx.come/example#Room"/>
    <isPartOf rdf:resource="http://http://www.xxx.come/example#Apartment_1"/>
    <hasSize rdf:datatype="http://www.w3.org/2001/XMLSchema#double">99.6</hasSize>
    <hasSize rdf:datatype="http://www.w3.org/2001/XMLSchema#double">145.5</hasSize>
</owl:NamedIndividual>
</rdf:RDF>

您将如何使用 Prolog 查询这样的三元组?我以为会是这样的:

is_part_of(Ind1, Ind2):- 
    rdf(Ind1, 
        "http://www.w3.org/1999/02/22-rdf-syntax-ns#isPartOf, 
        Ind2).

这显然行不通。

我还从 rdf 库中看到了 rdf_has(S,P,O,RealP),它看起来有点可用,但规范很模糊。

根据这个问题,如果两个人是班级怎么办?如果对象属性是数据类型属性怎么办?

我认为我被困在一个简单的问题上,但我已经搜索了很长时间的示例或类似问题,但没有找到任何东西。

提前致谢!

【问题讨论】:

  • 完全不清楚您使用哪个 SWI Prolog 包来处理 RDF 数据...
  • 无论如何,一些包的文档在这里swi-prolog.org/pldoc/doc_for?object=section(%27packages/…
  • ?- rdf(Ind1, 'http://www.xxx.come/example#isPartOf', Ind2).?- rdf(Ind1, 'http://www.xxx.come/example#hasSize', Ind2). 都为我工作。
  • 在他的查询中,rdf:type URI 周围的引号有问题 - 也许这就是问题所在。
  • @AKSW,是的。此外,@vw511 尝试使用 rdf:isPartOf 之类的东西,而不是 http://www.xxx.come/example#isPartOf

标签: xml rdf owl swi-prolog protege


【解决方案1】:

问题可能是semweb/rdf_dbdocumentation 中缺少快速入门示例。这是一个示例会话。

?- use_module(library(semweb/rdf_db)). 真的。 ?- rdf_load('example.owl', [format(xml)]). % 在 0.01 秒内解析“example.owl”; 11个三倍 真的。 ?- rdf(Ind1, 'http://www.xxx.come/example#isPartOf', Ind2). Ind1 = 'http://www.xxx.come/example#Room_1', Ind2 = 'http://http://www.xxx.come/example#Apartment_1'。 ?- rdf(Ind1, 'http://www.xxx.come/example#hasSize', Ind2). Ind1 = 'http://www.xxx.come/example#Room_1', Ind2 = literal(type('http://www.w3.org/2001/XMLSchema#double', '99.6')) 。 ?- % is_part_of(Ind1, Ind2):- rdf(Ind1, 'http://www.xxx.come/example#isPartOf', Ind2)。 | ['rules.pl']. 真的。 ?- is_part_of(Ind1, Ind2). Ind1 = 'http://www.xxx.come/example#Room_1', Ind2 = 'http://http://www.xxx.come/example#Apartment_1'。 ?- rdf_register_prefix(例如,'http://www.xxx.come/example#')。 真的。 ?- rdf(Ind1, ex:isPartOf, Ind2). Ind1 = 'http://www.xxx.come/example#Room_1', Ind2 = 'http://http://www.xxx.come/example#Apartment_1'。

代码中的错误:

  1. Prolog 中的原子应该用单引号括起来。
    至于双引号 - 参见例如this question。我的 SWI-Prolog 说:

    Type error: `atom' expected, found `"http://www.xxx.come/example#isPartOf"' (a string)

    无论如何,双引号也应该关闭。

  2. 您应该使用正确的完整 URI:http://www.xxx.come/example#isPartOf 而不是 http://www.w3.org/1999/02/22-rdf-syntax-ns#isPartOf

  3. 这个格式错误的 URI — http://http://www.xxx.come/example#Apartment_1 — 可能会导致其他问题。

【讨论】:

  • 非常感谢!现在它起作用了!我想我错过了一些小东西,没有把所有细节放在一起。很抱歉报价问题和修改后的格式错误的 URI...
【解决方案2】:

如果您已经定义了 RDFS 或 OWL 架构,您可以使用 rdfs2pl 将其转换为 prolog 规则。

结果与 Stanislav 提供的示例大体相同。查看提供的显式代码以了解正在发生的事情很有用,但如果您有大量谓词,为所有谓词编写显式规则可能会很乏味且容易出错。

生成的代码与提供的示例之间的一个区别是 rdfs2pl 在其生成的规则中使用rdf_has/3。你问过这个谓词。它在 RDF 图上提供有限的推理。例如,如果您有:

ex:isPartOf owl:inverseOf ex:hasPart .
ex:apartment1 ex:hasPart ex:room1.

然后查询rdf_has(X,myont:isPartOf,Y) 将返回一个带有X=ex:room1Y=ex:apartment1 的结果,即使它没有明确说明,它包含 OWL 的语义和你的inverseOf 声明.相比之下,rdf/3 只会查询 asserted 模型。

何时应该 rdf/3rdf_has/3 取决于您的用例。在进行查询时能够使用推理非常有用。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多