Pat は概念として Mike の電話番号を知っており、RDF/OWL の具体的な電話番号 1112223333 ではないとどのように言えばよいでしょうか?
パットがマイクの電話番号を知っていることをメアリーが知っていると述べることができるボーナスポイント....
Pat は概念として Mike の電話番号を知っており、RDF/OWL の具体的な電話番号 1112223333 ではないとどのように言えばよいでしょうか?
パットがマイクの電話番号を知っていることをメアリーが知っていると述べることができるボーナスポイント....
適切なプロパティを使用すると、「知っている」とrdf具体化を使用できます。
:Pat :knows [
rdf:subject :Mike ;
rdf:predicate :telephoneNumber ;
rdf:object <tel:1112223333>
]
具象化を好む人はほとんどいませんが、この種のことについては大丈夫です。2番目のケースでは、二重具体化をお楽しみください。
: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>
FILE2:
: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
] .
メアリーについてのあなたの他の声明は、私たちが単に「もの」を知ることについて話しているのではなく、知識に関する知識について話しているため、より困難です。これは、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 です」というトリプルを 1 つの名前付きグラフに貼り付け、「Pat はその名前付きグラフを知っている」というデフォルト グラフに別のトリプルを挿入します。
OWL は名前付きグラフをサポートしていませんが、SPARQL 1.0 と RDF 1.1 はサポートしていますが、標準の構文はまだありません。そのため、さまざまなグラフを個別のファイルから SPARQL ストアに個別にロードする必要があります。