【问题标题】:RDF - Distributing rdf:type to all items in the listRDF - 将 rdf:type 分配给列表中的所有项目
【发布时间】:2013-08-07 16:26:12
【问题描述】:

考虑以下 RDF:

semapi:BaseClass     a rdfs:Class; 
                     rdfs:subClassOf rdfs:Class .

semapi:hasChainTo a rdf:Property; 
                   rdfs:domain semapi:BaseClass;
                   rdfs:range  semapi:BaseClass .                   

semapi:DerivedClass  a rdfs:Class; rdfs:subClassOf semapi:BaseClass .                  

instances:Instance1 a semapi:DerivedClass;
                    semapi:hasChainTo (
                        [
                            a semapi:DerivedClass;
                                    semapi:hasChainTo (
                                           [C1]
                                           [C2]
                                    )
                            ]
                     )

如果semapi:hasChainTo rdfs:range semapi:BaseClass 则意味着列表rdf:type semapi:BaseClass

我真正想说的是列表中的每个item都是rdf:type(ei.[C1] rdf:type semapi:BaseClass[C2] rdf:type semapi:BaseClass,...)

我该怎么做?我需要 Owl(最好不需要)吗?

【问题讨论】:

  • 我很高兴看到此贴为一个问题,但您能否澄清您所说的“如果 smapi:hasChainTo rdfs:range semapi:BaseClass 那么它意味着 ([C1][C2]) rdf:type smapi:BaseClass."?我真的不跟。你想从x hasChainTo (A B C)x a Ax a Bx a C,对吧?
  • 您提到您不想使用 OWL(我认为这意味着您不想使用 OWL 推理器)。从the other question,听起来您正计划使用 RDFS 推理器。这个问题的选择可能取决于你可以使用什么样的推理器。您在另一个问题中提到的 Allegro RDFS++ 具有 Prolog 接口,因此可以提供帮助。您也可以使用 SPARQL 执行此操作。除了 RDF 列表,OWL 属性链也可以提供帮助。
  • 抱歉,为了更清楚,我重写了 OP,这与您在另一个答案中给出的示例相同,我想说列表中的每个项目都是某种类型,而不是列表本身就是那种类型.我已经在每个项目中都有[ a semapi:DerivedClass; ] 类型声明,但是您指出semapi:BaseClass rdfs:range semapi:BaseClass 我是说列表本身是semapi:BaseClass 类型。 rdfs:range 是正确的谓词吗?我可以说“rdfs:range List”吗? (伪代码)
  • 其实这个列表的目的是什么?毕竟你可以在 Turtle/N3 中写x a C1, C2, C3, C4.。有没有什么特别的东西使清单变得必要。在 RDFS 中,你可以说 sem:hasClass rdfs:subPropertyOf rdF:type,然后写 x sem:hasClass C1, C2, C3, C4.,然后 RDFS 推理器会处理其余的事情。你为什么首先想要这个列表?
  • 我基本上是在为自然语言自动完成建模,让用户“逐步”构建句子(或命令)。这意味着保留多个级别的上下文至关重要,因为“下一个”自动完成选项不仅基于最后一个,还基于最后一个 -1、最后一个 -2、最后一个 -3,......所以a hasChain b 不能如果它仅存在于层次结构中的某个级别,则概括为始终为真。这样的链可能只存在于层次结构的那个级别,而没有其他地方。这就是我使用列表和空白节点的原因。这有任何意义吗?我可以尝试进一步澄清。

标签: rdf semantic-web rdfs turtle-rdf


【解决方案1】:

根据您希望如何执行此操作,您有几个选择。我认为您正在尝试坚持非 OWL 推理,因此我们将确保包含这样的解决方案,但我也确实想谈谈 OWL 解决方案,因为对于一些类似的情况,它非常有效。

使用 OWL 和自定义 ObjectList

如果您确实可以选择使用 OWL 推理器,那么这是一个很好的案例,您可以创建自己的列表词汇表并使用一些属性链。这个想法是你引入一个类List 和一个单独的nil,以及属性firstrest。您实际上只是在自己的命名空间中复制词汇。然后假设你定义了两个属性

  • likes:将一个个体 X 与另一个个体 Y 联系起来; “X 喜欢 Y”。
  • likesList:将个人 X 与 X 喜欢的个人列表(但不是 RDF 列表)相关联。

那么可以引入两个属性链公理

  • likesList subPropertyChain likesList o rest: 如果 X likesList (_ ...),那么 X likesList (...)。

这样,从X likes (A B C) 我们得到X likes (A B C)X likes (B C)X likes (C)X likes nil

  • likes subPropertyChain likesList o first: 如果 X 喜欢List (A ...),那么 X 喜欢 A。

然后,从以上所有推断的陈述中,我们得到X likes AX likes BX likes C

在 Turtle 中,这看起来像:

@prefix :        <http://www.example.org/distributing#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://www.example.org/distributing>
      a       owl:Ontology .

:List
      a       owl:Class .

:nil  a       :List , owl:NamedIndividual .

:first
      a       owl:ObjectProperty .

:rest
      a       owl:ObjectProperty .

:likes
      a       owl:ObjectProperty ;
      owl:propertyChainAxiom
              (:likesList :first) .

[]    a       owl:Axiom ;
      rdfs:comment "If X likesList (A ...), then X likes A." ;
      owl:annotatedProperty
              owl:propertyChainAxiom ;
      owl:annotatedSource :likes ;
      owl:annotatedTarget (:likesList :first) .

:likesList
      a       owl:ObjectProperty ;
      rdfs:comment "Relates an individual I1 to a ObjectList of individuals that I1 likes." ;
      owl:propertyChainAxiom
              (:likesList :rest) .

[]    a       owl:Axiom ;
      rdfs:comment "If X likesList (A B C), then since (B C) is the rest of (A B C), X likesList (B C), too." ;
      owl:annotatedProperty
              owl:propertyChainAxiom ;
      owl:annotatedSource :likesList ;
      owl:annotatedTarget (:likesList :rest) .

如果您必须手动编写 RDF,这会有点不方便,因为您必须这样做

X :likesList [ :first A ;
               :rest [ :first B ;
                       :rest [ :first C ;
                               :rest nil ] ] ] .

并且不能使用 Turtle 包含的漂亮的 (...) 语法。这对于您遇到的情况也无济于事,因为 OWL 类不是个体,因此它们不能成为对象属性的对象,而 rdf:type 不是对象属性。我只是想包含它,因为它是对象属性分布在(非 RDF)个人列表上的一种好方法,并且因为该方法使以下解决方案更清晰。

使用 SPARQL 查询

给定数据,例如:

@prefix : <urn:ex:> .

:X :pList (:A :B :C :D) .

类似

的 SPARQL 查询
prefix : <http://example.org/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

construct { 
  ?x :p ?y 
} 
where { 
  ?x :pList/rdf:rest*/rdf:first ?y
}

产生

@prefix :        <http://example.org/> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:X    :p            :A ;
      :p            :C ;
      :p            :B ;
      :p            :D .

在模仿上述基于 OWL 的方法时,我使用了两个属性 pListp,但它们可能相同,在这种情况下,p 将“分布”在列表中。

有了某个数据存储,您应该能够使用insert/where 进行 SPARQL 更新:

prefix : <http://example.org/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

insert { 
  ?x :p ?y 
} 
where { 
  ?x :pList/rdf:rest*/rdf:first ?y
}

将数据添加到存储中。

使用类似 Prolog 的语法

如果您想真正让推理器执行此推理,那么您将处于推理器特定内容的领域。但是,许多推理器支持类似 Prolog 的查询语言,您也可以在那里编写这些规则。我不知道 AllegoGraph 的 RDFS++ 语法,但一般结构将包括一些定义,例如:

?x p ?y :- ?x pList ?list, ?list rdf:first ?y

?x pList ?l :- ?x pList ?list, ?list rdf:rest ?l

【讨论】:

  • 我可以设置一个赏金让你用非猫头鹰解决方案完成这个答案吗?我真的很想保持我原来的语法(使用嵌套的 RDF 列表)。
  • @parliament 我很乐意更新答案,无论赏金如何(但如果你无论如何奖励它,我仍然会说“谢谢”:)),但你能澄清一下究竟是什么你的意思是? SPARQL 解决方案没有使用 OWL,所以它是一个“非 Owl 解决方案”,不是吗?要调整解决方案的这一部分,您需要做的就是将 :pList 替换为 semapi:hasChainTo:p 替换为 rdf:type,除非我误解了您。
  • 约书亚谢谢。我没有意识到您的意思是 SPARQL 作为“非猫头鹰”解决方案。我不认为是这样,因为无论如何我都必须使用 SPARQL 进行查询,并且已经在 OP 中为 RDF 编写了工作查询。我认为您所说的“非 Owl”解决方案是一个 RDF/RDFS 唯一的解决方案,它允许我继续使用海龟列表语法(因为您提到 here 说“Protégé 正在丢弃一堆不是作为 OWL 本体的 RDF 序列化对它有意义”)。
  • 我正在寻找一种非 owl 解决方案,以便 Protege 将 RDF 列表作为有效 RDF 而不是“OWL 的 RDF 序列化”接受。
  • @parliament 对不起,我还是不太清楚你的意思; SPARQL 解决方案(进行了适当的更改)是否有效?它是纯 RDF,不使用任何 OWL。 Protégé 4.x 是一个基于 OWL 的工具,不支持普通的 RDFS 本​​体。如果您需要 RDFS 支持,则需要使用 Protégé 3.x。 Protégé 的各种版本支持哪些语言与给定解决方案是否使用 OWL 无关。
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 2020-10-08
  • 2021-02-14
  • 2014-10-16
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多