假设我想用 OWL 中的节点 A、B 和 C 表示下图,连接:
A-B d=1
B-C d=2
A-C d=3
例如,从 A 到 B 有一条边,距离 d=1
我想以某种方式在 OWL 中对这些关系进行建模,以明确所有 3 个连接都是“边缘距离”类型,但它们确实具有不同的值(d=1,2,3)我不会完成如果遵循使用 A、B、C 作为类并定义一个对象属性的方法:“边缘距离”并为距离关系分配不同的值。
或者换句话说,在 OWL 中对上面的图进行建模的有效方法是什么?
非常感谢!
假设我想用 OWL 中的节点 A、B 和 C 表示下图,连接:
A-B d=1
B-C d=2
A-C d=3
例如,从 A 到 B 有一条边,距离 d=1
我想以某种方式在 OWL 中对这些关系进行建模,以明确所有 3 个连接都是“边缘距离”类型,但它们确实具有不同的值(d=1,2,3)我不会完成如果遵循使用 A、B、C 作为类并定义一个对象属性的方法:“边缘距离”并为距离关系分配不同的值。
或者换句话说,在 OWL 中对上面的图进行建模的有效方法是什么?
非常感谢!
首先,属性与 OWL 中的类无关。相反,它们将个人联系起来。您可以声明属性的域和范围,在这种情况下,当找到该属性的使用时,可以推断出有关主体和客体的类型。如果属性 P 具有域 D 和范围 R,这意味着当您看到三元组时x P y
,您可以推断出x rdf:type D
和y rdf:type R
。
听起来您正在尝试表示具有相关权重的属性。严格来说,这是一种三元关系,因为您想说诸如edgeBetween(source,target,weight) 之类的东西。在 RDF 或 OWL 中表示此类信息的常用方法是使用一个新节点来表示关系的一个实例,并将这三个部分与该个体相关联。例如,
:edge345 :hasSource :nodeA .
:edge345 :hasTarget :nodeB .
:edge345 :hasWeight 34 .
甚至更紧凑:
:edge345 :hasSource :nodeA ;
:hasTarget :nodeB ;
:hasWeight 34 .
由于通常情况下您不需要识别关系的实例,而只是识别关系的一部分,因此您也可以在此处使用空白节点:
[] :hasSource :nodeA ;
:hasTarget :nodeB ;
:hasWeight 34 .
或者
[ :hasSource :nodeA ;
:hasTarget :nodeB ;
:hasWeight 34 ] .
你的图表,
A-B d=1
B-C d=2
A-C d=3
看起来像这样:
[ :hasSource :A ; :hasTarget :B ; :hasWeight 1 ] .
[ :hasSource :B ; :hasTarget :C ; :hasWeight 2 ] .
[ :hasSource :A ; :hasTarget :C ; :hasWeight 3 ] .
您可以通过定义一个微小的“网络”本体并使用 OWL 注释属性来表示距离来表示它。这种解决方案有一些缺点(注释属性没有智能推理),但理解起来相对简单。
曼彻斯特语法中的伪代码:
# Prefix used for the demo:
Prefix: network: <http://www.example.org/>
# Annotation property that will hold the distance value between two nodes
AnnotationProperty: <network:distance>
# Edges will be modelled with an object property
ObjectProperty: <network:edge>
# We define the concept of "Node" as a class.
Class: <network:Node>
# Two individuals A and B are declared. They represent node instances
Individual: <network:B>
Individual: <network:A>
Facts:
# Annotation of the axiom below (link A -> B)
# with a value for the distance
Annotations: <network:distance> "1"
# The object property linking the node A to the node B
<network:edge> <network:B>