我正在尝试将当前的关系数据库转换为 RDF/OWL 三元组存储。我遇到的一件事是,当我有一个桥/连接表,其中有多个值的复合/复合键时。例如,我有以下内容:
Equipment (EquipmentId)
EquipmentPoints (EquipmentId, PointId, CommodityId)
Point (PointId)
我不确定如何对数据进行建模以表示“
Equipment :hasPoint ...
”?特定点可能是不同的商品,具体取决于其所在设备的类型。
感谢任何帮助。
首先,也许你可以重塑事物,摆脱
:EquipmentPoint
。它们可能只是关系建模的产物。 RDF 属性可以有多个值。请参阅此处了解更多详情。
为了清楚起见,我将稍微简化您的数据模型:
Equipment (EquipmentId)
EquipmentPoints (EquipmentId, PointId)
Point (PointId)
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 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 .
数据集中的实体可以精确地相互链接,就像一个网站可以链接到另一个网站一样。从这个意义上说,不存在主键或特殊的复合键之类的东西。只有相互链接的资源。
在你的情况下,我可能会像下面的例子一样建模:
@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> .
显然要修改名称等。 正如你所看到的,没有键的概念,它只是知识图中的一堆边,它描述了两个资源之间的链接。正如我上面所描述的,带有复合键的表可能只是一个单独的资源。没有主键,但是应该还是可以搜索到的。