1

2 つの異なるプロパティを持つが同じ名前の 2 つのクラスがある場合:

[RdfSerializable]
public class Type1
{
    [RdfProperty(true), Name = "title"]
    public string Title { get; set; }
}

[RdfSerializable]
public class Type2
{
    [RdfProperty(true), Name = "title"]
    public string Title { get; set; }
}

それらを RDF にシリアル化し、http://www.w3.org/RDF/Validator/サービスで検証してみてください。すべてが大丈夫で、正しいです。しかし、OntologyExtractor.exe ツールを使用してこれらのクラスから OWL ファイルを生成しようとすると、「オントロジーの抽出に失敗しました。http://test.org/1.0#titleが複数のタイプに割り当てられています。」というメッセージが表示されます。上位クラスは正しく、同じ名前のプロパティを持つ異なるクラスで同じ状況になるいくつかの RDF 仕様があるため、これは奇妙なメッセージです。

4

1 に答える 1

2

ROWLEX のバグだと思います。あなたのケースは有効ですが、私が OntologyExtractor を書いたとき、私はそれを準備していなかったと思います。できるだけ早く修正をリリースするように努めます。

EDIT : ROWLEX2.1 がリリースされました。 http://rowlex.nc3a.nato.intからダウンロードできます。バージョン 2.1 (とりわけ) は、共有プロパティ機能をサポートするようになりました。質問の正確なコードでも同じエラーが発生します! これを克服するには、コードの装飾を次のように変更する必要があります。

[RdfSerializable] 
public class Type1 
{ 
    [RdfProperty(true, Name = "title", ExcludeFromOntology=true)] 
    public string Title { get; set; } 
} 

[RdfSerializable] 
public class Type2 
{ 
    [RdfProperty(true, Name = "title", 
               DomainAsType = new Type[]{typeof(Type1), typeof(Type2)})] 
    public string Title { get; set; } 
} 

OntologyExtractor.exe を使用すると、このコードは Type1 と Type2 の UNION である匿名ドメイン クラスの OWL プロパティを生成します。
これは技術的には完全に正しい解決策ですが、プロパティにドメインを設定すると、将来の再利用の可能性が制限されます。解決策として、プロパティ ドメインをローカルの制限に置き換えることができます。次のようにしてそれを達成できます。

[RdfSerializable] 
public class Type2 
{ 
    [RdfProperty(true, Name = "title", 
               DomainAsType = new Type[]{typeof(Type1), typeof(Type2)},
               UseLocalRestrictionInsteadOfDomain = true)] 
    public string Title { get; set; } 
} 

UseLocalRestrictionInsteadOfDomain を設定しないままにしておくと、ROWLEX は現在のコンテキストに従ってドメイン制限とローカル制限のどちらかを選択します。

于 2009-08-07T09:26:52.220 に答える