如何在 RDF/OWL 中建模复合键

问题描述 投票:0回答:2

我正在尝试将当前的关系数据库转换为 RDF/OWL 三元组存储。我遇到的一件事是,当我有一个桥/连接表,其中有多个值的复合/复合键时。例如,我有以下内容:

  • Equipment (EquipmentId)

  • EquipmentPoints (EquipmentId, PointId, CommodityId)

  • Point (PointId)

我不确定如何对数据进行建模以表示“

Equipment :hasPoint ...
”?特定点可能是不同的商品,具体取决于其所在设备的类型。

感谢任何帮助。

constraints rdf owl
2个回答
2
投票

首先,也许你可以重塑事物,摆脱

:EquipmentPoint
。它们可能只是关系建模的产物。 RDF 属性可以有多个值。请参阅此处了解更多详情。

为了清楚起见,我将稍微简化您的数据模型:

  • Equipment (EquipmentId)
  • EquipmentPoints (EquipmentId, PointId)
  • Point (PointId)

RDF

RDF 是无模式的,RDF 中没有约束。

您可以对事物进行建模,如另一个答案所示:

@prefix : <https://stackoverflow.com/q/51974155/7879193#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

:equipment1 rdf:type :Equipment .
:equipment2 rdf:type :Equipment .

:point1 rdf:type :Point .
:point2 rdf:type :Point .

:equipmentPoint1 rdf:type :EquipmentPoint .
:equipmentPoint2 rdf:type :EquipmentPoint .

:equipmentPoint1 :hasEquipment :equipment1 ;
                 :hasPoint :point1 .

:equipmentPoint2 :hasEquipment :equipment1 ;
                 :hasPoint :point1 . # "constraint violation"

为了定义约束,您可以使用 SHACL 等语言。不幸的是,SHACL 中没有复合键的“核心约束组件”。可以使用基于 SPARQL 的约束 :EquipmentPointShape a sh:NodeShape ; sh:targetClass :EquipmentPoint ; sh:sparql [ sh:message "Violation!" ; sh:severity sh:Violation ; sh:select """ SELECT ?this { ?point1 ^:hasPoint ?this, ?that . ?equipment ^:hasEquipment ?this, ?that . FILTER (?this != ?that) } """ ] .

猫头鹰

OWL 是为推理而设计的,而不是为了约束检查。有关更多详细信息,请参阅

此答案

。但是,您可以使用 OWL 2 键 首先,添加一些本体“样板”:

[] rdf:type owl:Ontology . :Equipment rdf:type owl:Class . :Point rdf:type owl:Class . :EquipmentPoint rdf:type owl:Class . :hasPoint rdf:type owl:ObjectProperty . :hasEquipment rdf:type owl:ObjectProperty . :equipment1 rdf:type owl:NamedIndividual . :equipment2 rdf:type owl:NamedIndividual . :point1 rdf:type owl:NamedIndividual . :point2 rdf:type owl:NamedIndividual . :equipmentPoint1 rdf:type owl:NamedIndividual . :equipmentPoint2 rdf:type owl:NamedIndividual .

现在你有了正确的 Turtle 序列化本体。然后添加:

:EquipmentPoint owl:hasKey (:hasEquipment :hasPoint ) . [ rdf:type owl:AllDifferent ; owl:distinctMembers (:equipmentPoint1 :equipmentPoint2 ) ] .

推理机会推断出你的本体论是不一致的。

注意,OWL 中没有唯一名称假设,并且有开放世界假设。

移除后

[ rdf:type owl:AllDifferent ; owl:distinctMembers (:equipmentPoint1 :equipmentPoint2 ) ] .

推理者会推断出

:equipmentPoint1 owl:sameAs :equipmentPoint2 .



1
投票

数据集中的实体可以精确地相互链接,就像一个网站可以链接到另一个网站一样。从这个意义上说,不存在主键或特殊的复合键之类的东西。只有相互链接的资源。

在你的情况下,我可能会像下面的例子一样建模:

@base <http://example.com/resource/> . <Equipment1> <hasId> "1" . <Equipment1> <name> "Equipment 1" . <Point1> <hasId> "1" . <Point1> <description> "This is Point 1" . <Equipment1> <hasEquipmentPoint> <EquipmentPoint1> . <Point1> <hasEquipmentPoint> <EquipmentPoint1> . <EquipmentPoint1> <hasCommodity> <Commodity1> .

或者,您可以尝试将其建模为更接近您所呈现的表格,并使 EquipmentPoint 链接到点和设备:

<EquipmentPoint1> <hasEquipment> <Equipment1> . <EquipmentPoint1> <hasPoint> <Point1> . <EquipmentPoint1> <hasCommodity> <Commodity1> .

显然要修改名称等。
正如你所看到的,没有键的概念,它只是知识图中的一堆边,它描述了两个资源之间的链接。正如我上面所描述的,带有复合键的表可能只是一个单独的资源。没有主键,但是应该还是可以搜索到的。

© www.soinside.com 2019 - 2024. All rights reserved.