1

我想使用 RDF 推理推断具有相同属性值的对象之间的 owl:sameAs 关系。

IE

  • object1 dc:title someTitle
  • object2 dc:title someTitle

推断具有匹配标题的所有对象之间关系的代码是什么?

另外,当属性不同时我可以这样做吗?

IE

  • object1 dc:title someTitle
  • object2 rdf:title someTitle

问候

4

2 回答 2

2

不在 RDF 或 RDFS 中

RDF 没有内置大量语义,虽然 RDFS 提供了一些语义,但我认为这两者都不足以让您获得所需的推理。但是,由于您正在寻找创建 owl:sameAs 链接,您可能正在使用 OWL 推理器,在这种情况下,这并不太难,而且在 SPARQL 中也很容易。其余的答案涵盖了这两种情况。

在猫头鹰

您只需要声明手头的属性是反函数(对象)属性

9.2.8 反函数对象属性

对象属性逆功能公理 InverseFunctionalObjectProperty(OPE) 表明对象属性表达式 OPE 是逆功能的——也就是说,对于每个单独的 x,最多可以有一个单独的 y,使得 y 通过 OPE 与 x 连接。

一个典型的例子是任何类型的唯一标识符,例如纳税人 ID 号。例如,

ex:hasSSN a owl:InverseFunctionalProperty .
:JohnDoe :hasSSN :ssnXXX-XX-XXXX .
:JDoe :hasSSN :ssnXXX-XX-XXXX .

从这些,我们可以用 OWL 推理推断出

:JohnDoe owl:sameAs :JDoe .

请注意,只有对象属性可以是反函数的(尽管我认为一些推理器会处理反函数数据类型属性);这意味着您可能必须像我上面所做的那样“包装”一些值,创建一个 IRI 个体 :ssnXXX-XX-XXX 而不是使用字符串“XXX-XX-XXXX”。请参阅 反函数数据类型属性有什么问题?关于为什么的一些讨论。

现在,如果您有两个不同的属性,那么您可以将它们都设为某个新属性的子属性,并使新属性反函数。例如

:hasSSN rdfs:subPropertyOf :hasTaxpayerIDOrSSN .
:hasTaxpayerID rdfs:subPropertyOf :hasTaxpayerIDOrSSN .
:hasTaxpayerIDOrSSN a owl:InverseFunctionalProperty .

然后从

:JohnDoe :hasSSN :ssnXXX-XX-XXXX .
:JDoe :hasSSN :ssnXXX-XX-XXXX .

你可以推断

:JohnDoe :hasTaxpayerIDOrSSN :ssnXXX-XX-XXXX .
:JDoe    :hasTaxpayerIDOrSSN :ssnXXX-XX-XXXX .

从那,那

:JohnDoe owl:sameAs :JDoe .

在 SPARQL 中

在 SPARQL 中,这也很容易。首先,要查询的一些数据:

@prefix : <urn:ex:> .

:JohnDoe :hasSSN :ssnXXX-XX-XXX .
:JDoe :hasSSN :ssnXXX-XX-XXX .

然后我们可以定义一个简单的构造查询:

prefix : <urn:ex:>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?x owl:sameAs ?y }
where { ?z ^:hasSSN ?x, ?y }
@prefix :      <urn:ex:> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .

:JDoe   owl:sameAs  :JohnDoe , :JDoe .

:JohnDoe  owl:sameAs  :JohnDoe , :JDoe .

如果你想使用多个属性,你可以在属性路径中使用一个替代。这是数据、查询和结果:

@prefix : <urn:ex:> .

:JohnDoe :hasSSN :ssnXXX-XX-XXX .
:JDoe :hasTaxpayerID :ssnXXX-XX-XXX .
prefix : <urn:ex:>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?x owl:sameAs ?y }
where { ?z ^(:hasSSN|:hasTaxpayerID) ?x, ?y }

@prefix :      <urn:ex:> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .

:JDoe   owl:sameAs  :JDoe , :JohnDoe .

:JohnDoe  owl:sameAs  :JDoe , :JohnDoe .
于 2015-03-19T14:42:39.417 回答
0

您可以尝试使用 SILK 框架:http ://wifo5-03.informatik.uni-mannheim.de/bizer/silk/

我已经多次成功地使用它来查找来自不同数据集的实体之间的 owl:sameAs 关系(例如,如果您有一个包含省份的数据集,并且您想从 DBpedia 中查找哪些实体具有相同的省份名称)。据我所知,您也可以使用它来匹配来自同一数据集的元素。

使用 SILK 的优点是您有多种算法来比较具有相似值的实体(例如,someTitle、some Title、Sometitle 和 SOMETITLE 将被匹配)。您可以使用过滤器来获得所需的结果。唯一的缺点是,如果您降低距离值来比较 SILK 可能会匹配“some Title”和“som Title”之类的值,根据您的用例,这可能是错误的。

于 2015-03-20T17:07:44.527 回答