如何推断具有相同名称的 objects 之间的 sameAs 关系

How to infer a sameAs relation between objects with the same name

我想使用 RDF 推理推断 objects 与 属性 具有相同值的 owl:sameAs 关系。

推断所有 objects 与匹配标题之间的关系的代码是什么?

还有,属性不一样的时候可以吗?

此致

不在 RDF 或 RDFS 中

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

在OWL

你只需要声明手头的属性是一个inverse functional (object) property:

9.2.8 Inverse-Functional Object Properties

An object property inverse functionality axiom InverseFunctionalObjectProperty( OPE ) states that the object property expression OPE is inverse-functional — that is, for each individual x, there can be at most one individual y such that y is connected by OPE with x.

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

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

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

:JohnDoe owl:sameAs :JDoe .

请注意,只有对象属性可以是反函数的(尽管我认为一些推理者会处理反函数数据类型属性);这意味着您可能必须像我上面那样 "wrap" 一些值,创建一个 IRI 个体 :ssnXXX-XX-XXX 而不是使用字符串 "XXX-XX-XXXX"。看 What's the problem with inverse-functional datatype properties? 讨论原因。

现在,如果您有两个不同的属性,那么您可以使它们都成为某些新 属性 的子属性,并使新的 属性 具有逆功能。例如

: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 .

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

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

使用 SILK 的优势在于您可以使用多种算法来比较具有相似值的实体(例如,someTitle、some Title、Sometitle 和 SOMETITLE 将被匹配)。您可以使用过滤器来获得您想要的结果。唯一的缺点是,如果您降低距离值进行比较,SILK 可能会匹配 "some Title" 和 "som Title" 等值,这可能是错误的,具体取决于您的用例。