2

ここで定義されているスキーマからエンティティ (Java 言語の POJO) を生成するコード ジェネレーターを作成していますhttp://schema.rdfs.org/all.ttl。Jena を使用して ttl ファイルを解析し、それらを生成するために必要なメタ データを取得しています。

Jena はファイルを正常に解析しますが、何らかの理由で特定のエンティティ (Person など) のすべての属性をリストしていません。何か間違ったことをしているのか、間違った API を使用しているのかなど、よくわかりません。シナリオを再現するコード サンプルを次に示します。

    public class PersonParser {

    public static void main(String[] args) {
        OntModel model = ModelFactory.createOntologyModel();
        URL url = Thread.currentThread().getContextClassLoader().getResource("schema_org.ttl");
        model.read(url.toString(), "TURTLE");
        OntClass ontclass = model.getOntClass("http://schema.org/Person");
        Iterator<OntProperty> props = ontclass.listDeclaredProperties();
        while (props.hasNext()) {
            OntProperty p = props.next();
            System.out.println("p:" + p.getLocalName());
        }
    }
}

基本的に、Person という名前のクラスを 1 つだけ探して、そのすべてのプロパティをリストしようとすると、次のようになります。

p:alternateName
p:deathDate
p:alumniOf
p:sameAs
p:url
p:additionalName
p:homeLocation
p:description
p:nationality
p:sibling
p:follows
p:siblings
p:colleagues
p:memberOf
p:knows
p:name
p:gender
p:birthDate
p:children
p:familyName
p:jobTitle
p:workLocation
p:parents
p:affiliation
p:givenName
p:honorificPrefix
p:parent
p:colleague
p:additionalType
p:honorificSuffix
p:image
p:worksFor
p:relatedTo
p:spouse
p:performerIn

しかし、 http://schema.org/Personを見ると、一覧にないプロパティがたくさんあります (たとえば、address)。http://schema.rdfs.org/all.ttlschema:addressでの宣言は次のとおりです。

schema:address a rdf:Property;
    rdfs:label "Address"@en;
    rdfs:comment "Physical address of the item."@en;
    rdfs:domain [ a owl:Class; owl:unionOf (schema:Person schema:Place schema:Organization) ];
    rdfs:range schema:PostalAddress;
    rdfs:isDefinedBy <http://schema.org/Person>;
    rdfs:isDefinedBy <http://schema.org/Place>;
    rdfs:isDefinedBy <http://schema.org/Organization>;
    .

誰かがこれに出くわしましたか?スキーマを解析するために別の Jena インターフェイスを使用する必要がありますか?

4

1 に答える 1

3

listDeclaredProperties のドキュメントは次のとおりです (強調を追加)。

listDeclaredProperties

com.hp.hpl.jena.util.iterator.ExtendedIterator<OntProperty> listDeclaredProperties(boolean direct)

このクラスのフレームのようなビューに関連付けられたプロパティの反復子を返します。これにより、クラスのプロパティの直感的な概念が得られます。これは、たとえば、クラスのインスタンスをインスタンス化するためのフォームを自動的に構築することによって、ユーザー インターフェイスでオントロジー クラスを提示するのに役立ちます。クラスのフレームのようなビューのプロパティは、このクラスの OntModel のプロパティのドメインをクラス自体と比較することによって決定されます。詳細について は、 RDF をフレームとして提示するを参照してください。

プロパティがクラスに関連付けられているかどうかを判断する多くのケースは、RDFS または OWL の推論に依存することに注意してください。したがって、このメソッドは、アタッチされた推論を持つモデルでのみ完全な結果を返す場合があります。

パラメーター:

  • direct - true の場合、返されるプロパティをこのクラスに直接関連付けられているものに制限します。false の場合、このクラスのスーパークラスのプロパティは、このクラスの宣言されたプロパティにリストされません。

戻り値:

ドメインによってこのクラスに関連付けられているプロパティの反復。

そのため、特定のスキーマを確認する前に、推論を使用しない限り、期待する結果が得られない可能性があることに注意することが重要です。次に、addressプロパティがどのように宣言されているかに注意してください。

schema:address a rdf:Property;
    rdfs:label "Address"@en;
    rdfs:comment "Physical address of the item."@en;
    rdfs:domain [ a owl:Class; owl:unionOf (schema:Person schema:Place schema:Organization) ];
    rdfs:range schema:PostalAddress;
    rdfs:isDefinedBy <http://schema.org/Person>;
    rdfs:isDefinedBy <http://schema.org/Place>;
    rdfs:isDefinedBy <http://schema.org/Organization>;

addressのドメインは共用体クラスです: PersonまたはPlaceまたはOrganization。これはPersonのスーパークラスですが、単純な名前付きクラスではなく、複雑なクラス式であるため、Jena にそれがPersonのスーパークラスであることを認識させるには、ドキュメントに記載されているように、推論が必要になるでしょう。

OWLセマンティクスとの比較

推論を使用すると、Jena はaddressのドメインがPersonのスーパークラスであることを認識できるようになり、それを listDeclaredProperties の結果に含めることができると思います。ただし、これが OWL セマンティクスとどのように異なるかは注目に値します。

OWLでは、クラスDがプロパティPのドメインであるということは、プロパティPを持つトリプルがあるときはいつでも、主語がDであると推論できることを意味します。これは、次のルールで表現できます。

P rdfs:domain D     X P Y
-------------------------
    X rdf:type D

したがって、Personに住所がある場合でも、何かに住所があるからといって、その何かPersonであると判断するには不十分です。それはまだPlaceまたはOrganizationである可能性があります。

于 2014-04-02T14:22:27.427 に答える