4

我如何声明 Pat 知道 Mike 的电话号码是一个概念,而不是 RDF/OWL 中的具体电话号码 1112223333?

能够说明玛丽知道帕特知道迈克的电话号码的奖励积分....

4

3 回答 3

4

使用合适的属性“知道”,您可以使用 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 中为您提供的内容。

于 2012-10-29T17:19:34.970 回答
3

以下情况如何(使用有效的 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
    ] .
于 2012-11-01T10:21:59.273 回答
2

我会用命名图来解决这个问题。将三元组“Mike 的电话号码是 1112223333”粘贴到一个命名图中,然后将另一个三元组放入默认图中,“Pat 知道那个命名图”。

OWL 不支持命名图,但 SPARQL 1.0 和 RDF 1.1 支持,尽管还没有标准语法,因此您需要将各种图从单独的文件单独加载到 SPARQL 存储中。

于 2012-10-29T06:39:21.047 回答