使用 SPARQL UPDATE 添加个人的推荐方法是什么?

What is the recommended way for adding individuals with SPARQL UPDATE?

我知道要将一个个体(class 的实例)添加到三重存储是使用以下插入语句:

PREFIX indv:<http://someexample.com/blah>
PREFIX ont:<http://someotherexample.com/blah/ontology#>
INSERT DATA
{
indv:individual_name rdf:type ont:SomeClassName.
}

我的问题是:这够了吗?

我问这个是因为我使用 protege 在 owl 文件中添加了一些人,我看到该文件又添加了一个三重:

indv:individual_name rdf:type owl:NamedIndividual.

这个三元组是否也需要插入到三元组存储中? 插入这个三元组有什么好处或有什么缺点?

My question is: is this enough?

在RDF中简单地添加一个class的实例,就足够了。在 RDF 中,资源可以是 classes 的成员,并且由具有 属性 rdf:type.

的三元组表示

I am asking this because I added some individuals to an owl file using protege and I saw that the file had one more triple added:

indv:individual_name rdf:type owl:NamedIndividual.

Is it necessary to insert this triple into the triple store as well? What are the benefits for inserting this triple or are there any disadvantages?

OWL 比 RDF 有更多的结构。 OWL 实际上是一种基于公理和断言的逻辑语言。它仍然使用 IRI 作为标识符,并且设计者确保支持 序列化 OWL 本体到 RDF 中。因此,您实际上是在处理 RDF 中 OWL ontology 的序列化。一般来说,您可能会发现官方文档 OWL 2 Web Ontology Language Mapping to RDF Graphs 很有用。

您在 Protege 的输出中看到的实际上是 两个 OWL 公理的序列化。在 OWL 中,您可以声明一个个体而无需指定它所属的任何 classes。你用这样的公理来做到这一点(从上面链接的文档中复制):

Declaration( NamedIndividual( *:a ) )

这被翻译成 RDF 作为三元组:

T(*:a) rdf:type owl:NamedIndividual .

T(*:a) 符号只是意味着无论 *:a 的翻译是什么,它都是三元组的主题。所以 "x rdf:type owl:NamedIndividual" 三元组实际上负责声明“x 是一个个体。也就是说,要声明某物是一个个体,你只需要做:

INSERT DATA { indv:individual_name rdf:type owl:NamedIndivual }

那么如何添加另一种类型(如在原始 SPARQL 更新中那样)?在 OWL 中,你说 "a" 是某个 class 的成员,用 class 表达式表示 "CE",公理为:

ClassAssertion( CE a )

翻译成 RDF 为

T(a) rdf:type T(CE) .

T(a) 和 T(CE) 符号只是表明 "a" 和 "CE" 在 RDF 中的表示可能比简单的 IRI 或空白节点或文字更复杂。例如,class 表达式可能是一个 unionOf 或一个 intersectionOf 等。因此,如果您想添加一个 class 断言公理,您将使用 SPARQL 更新,例如:

INSERT DATA {
  indv:individual_name rdf:type ont:SomeClassName.
}

当然,只有当您实际上也声明了个人时才应该这样做(尽管您会发现在实践中并不总是遵循这一点)。所以,总而言之,您可能想要这样的更新:

INSERT DATA {
  indv:individual_name rdf:type ont:SomeClassName, owl:NamedIndividual
}

(i) 声明个人,并且 (ii) 断言个人是特定 class 的成员。