我如何声明 Pat 知道 Mike 的电话号码是一个概念,而不是 RDF/OWL 中的具体电话号码 1112223333?
能够说明玛丽知道帕特知道迈克的电话号码的奖励积分....
我如何声明 Pat 知道 Mike 的电话号码是一个概念,而不是 RDF/OWL 中的具体电话号码 1112223333?
能够说明玛丽知道帕特知道迈克的电话号码的奖励积分....
使用合适的属性“知道”,您可以使用 rdf 物化:
:Pat :knows [
rdf:subject :Mike ;
rdf:predicate :telephoneNumber ;
rdf:object <tel:1112223333>
]
很少有人喜欢物化,但对于这种事情,没关系。对于第二种情况,享受双重具体化:
:Mary :knows [
rdf:subject :Pat ;
rdf:predicate :knows ;
rdf:object [
rdf:subject _:b1 ;
rdf:predicate rdf:subject ;
rdf:object :Mike ;
rdf:subject _:b2 ;
rdf:predicate rdf:predicate ;
... sanity barrier exceeded ...
]
]
如果您乐于离开单个图表,生活会更简单。你可能只有几个文件:
文件1:
:Mary :knowsContentsOf <FILE2>
文件2:
:Mike :telephoneNumber <tel:1112223333>
或者甚至将两者都粘贴在一个文件信封中并指向文件的片段。这本质上就是命名图在 SPARQL 中为您提供的内容。
以下情况如何(使用有效的 OWL DL 来娱乐):
# assume prefixes defined
<> a owl:Ontology .
:Person a owl:Class .
:PhoneNumber a owl:Class .
:knowsThing a owl:ObjectProperty;
rdfs:domain :Person .
:belongsTo a owl:ObjectProperty;
rdfs:range :Person .
:Mike a :Person .
:Pat a :Person;
:knowsThing [
a :PhoneNumber;
:belongsTo :Mike
] .
你关于 Mary 的另一个陈述比较困难,因为我们不只是在谈论知道一个“事物”,我们在谈论关于知识的知识,这在 OWL 和 RDF 中非常不方便。但是,让我们坚持在 OWL DL 中进行挑战,使用以下本体:
<> a owl:Ontology .
:Person a owl:Class .
:PhoneNumber a owl:Class .
:knowsThing a owl:ObjectProperty;
rdfs:domain :Person .
:knownBy a owl:AnnotationProperty;
rdfs:range :Person .
:belongsTo a owl:ObjectProperty;
rdfs:range :Person .
:Mike a :Person .
:Pat a :Person;
:knowsThing _:mikesnumber .
_:mikesnumber a :PhoneNumber;
:belongsTo :Mike .
:Mary a :Person .
[] a owl:Annotation;
owl:annotatedSource :Pat;
owl:annotatedProperty :knowsThing;
owl:annotatedTarget _:mikenumber;
:knownBy :Mary .
问题是它不会让你在推理方面得到太多。user205512 和 cygri 的答案是合理的选择,但在推理方面它们也没有给你太多帮助。
要获得更多推理能力,您可以做一些疯狂的事情,例如(仅适用于 OWL 2 DL 或 OWL Full):
:subject a owl:ObjectProperty;
rdfs:domain :Statement .
:predicate a owl:ObjectProperty;
rdfs:domain :Statement .
:object a owl:ObjectProperty;
rdfs:domain :ObjectStatement .
:dataObject a owl:DatatypeProperty;
rdfs:domain :DataStatement .
:hasPhone a owl:DatatypeProperty .
:knowsFact a owl:ObjectProperty;
rdfs:domain :Person;
rdfs:range :Statement .
:ObjectStatement a owl:Class;
rdfs:subClassOf [
owl:onProperty :object;
owl:cardinality 1
] .
:DataStatement a owl:Class;
rdfs:subClassOf [
owl:onProperty :dataObject;
owl:cardinality 1
] .
:Statement a owl:Class;
owl:unionOf ( :ObjectStatement :DataStatement );
rdfs:subClassOf [
owl:onProperty :subject;
owl:cardinality 1
], [
owl:onProperty :predicate;
owl:cardinality 1
] .
:Person a owl:Class .
:Pat :knowsFact [
:subject :Mike;
:predicate :hasPhone
] .
:Mary :knowsFact [
:subject :Pat;
:predicate :knowsFact;
:object [
:subject :Mike;
:predicate :hasPhone
] .
我会用命名图来解决这个问题。将三元组“Mike 的电话号码是 1112223333”粘贴到一个命名图中,然后将另一个三元组放入默认图中,“Pat 知道那个命名图”。
OWL 不支持命名图,但 SPARQL 1.0 和 RDF 1.1 支持,尽管还没有标准语法,因此您需要将各种图从单独的文件单独加载到 SPARQL 存储中。