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

“ Room_1 isPartOf 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)看起来有点可用,但规范含糊不清。

紧接着这个问题,如果两个人都是阶级怎么办? 如果对象属性是数据类型属性怎么办?

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

提前致谢!

#1楼 票数:2 已采纳

可能的问题是semweb/rdf_db 文档中没有快速semweb/rdf_db示例。 这是一个示例会话。

?- use_module(library(semweb/rdf_db)).
true.

?- rdf_load('example.owl', [format(xml)]).
% Parsed "example.owl" in 0.01 sec; 11 triples
true.

?- 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'].
true.

?- 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(ex, 'http://www.xxx.come/example#').
true.

?- rdf(Ind1, ex:isPartOf,  Ind2).
Ind1 = 'http://www.xxx.come/example#Room_1',
Ind2 = 'http://http://www.xxx.come/example#Apartment_1'.

您的代码中的错误:

  1. Prolog中的原子应该用单引号引起来。
    至于双引号-参见例如这个问题 我的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 )可能会导致其他问题。

#2楼 票数:1

如果已经定义了RDFS或OWL模式,则可以使用rdfs2pl将其转换为序言规则。

结果与斯坦尼斯拉夫提供的示例大致相同。 查看提供的显式代码以了解正在发生的事情很有用,但是如果您有大量的谓词,那么为它们编写显式规则可能很乏味且容易出错。

生成的代码与提供的示例之间的区别是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 entailed宣言。 相反, rdf/3将仅查询断言的模型。

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

  ask by vw511 translate from so

未解决问题?本站智能推荐:

1回复

如何使用SWI-Prolog的语义Web库查询RDF/OWL?

如何使用SWI-Prolog语义Web库查询OWL / RDF文件并提取一些信息? OWL / RDF文件包含有关所有Debian软件包的信息,因此我需要进行查询以查找软件包依赖项。 例如: OWL文件的结构如下: 如何将OWL / RDF文件加载到Prolog脚本中,在Prol
1回复

如何将RDF图形属性转换为OWL对象属性?

我需要将我的RDF图形文档转换为Protege 3.x识别的OWL(1或2)。 有W3C建议将OWL 2 Web本体语言映射映射到RDF图 ,该建议说要从RDF图声明对象属性,应添加rdf:type owl:ObjectProperty元素。 我在以下代码中发现了用RDF图形式表示OWL对象
1回复

在Protege中使用RDF/XML格式创建的本体文件是RDF文件还是OWL文件?

我已经在 Protege 中创建了本体文件并将其保存为 RDF/XML 格式。 它还包含 OWL 标签。 那么,Protege 创建并保存为 RDF/XML 格式的本体文件实际上是 RDF 文件或 OWL 文件的 RDF 形式或包含 RDF 的 OWL 格式或其他什么?<?xml versio
2回复

使用定义的OWL本体创建RDF

我正在为数据库表生成RDF。 我使用Protégé为表生成了OWL本体。 我想使用该OWL本体并使用Jena为表数据创建RDF / XML格式的RDF。 我知道如何将RDF和OWL文件读写到内存中以生成模型,并且知道如何使用Resource,Property,ModelFactory等类生
1回复

RDF“描述”与OWL“NamedIndividual”

我在 Protege 5 中有一个本体,我将其另存为 RDF/XML 并生成以下格式: 当我使用 JENA API 尝试在 RDF 中生成新实例时,我得到: 为什么一个叫“NamedIndividual”,一个叫“Description”,JENA 不兼容OWL? 如果没有,我可以使用什么库来制作第
3回复

RDF/OWL到TRIPLE商店

我在Protege中创建了一个本体。 现在我的应用程序具有更好的可伸缩性,我喜欢将OWL文件转换为三重存储并查询存储。 如何将owl文件转换为三重存储?
1回复

用于将OWL/XML转换为RDF/XML的命令行选项/工具

我编写了一个脚本,该脚本将关系数据库导出到OWL / XML文件,尽管现在我需要RDF / XML格式的数据。 是否有人知道命令行工具或执行此操作的简单方法(将OWL语法转换为RDF)? 我想避免重写脚本。 我知道曼彻斯特大学有一个在线语法转换器,但是这没什么用,因为我需要可以离线使用的
1回复

RDF和OWL工作流程问题

我一直在通过Protege查看和玩OWL,我想知道我是否正确理解了“工作流程”和它的想法(从头开始构建数据库: 使用Protege或等效项为您的数据生成OWL本体 将此架构导出到RDF 使用定义为triplestore中某些元素的类以及目标数据 将您的triplestor