質問

私のプロジェクトではrowlexを使用しています。RDF ファイル内で個人に割り当てられたプロパティがあり、値があります。たとえば、個々の「Student」には、クラス URI の値「class00021」を持つプロパティ「isMemberOf」があります。次に、このプロパティに 2 番目の値を追加します。たとえば、uri が「proj000052」の「Project」値です。

問題はここに表示されます。2 番目の値を追加した後、最初の値はプロパティ 'isMemberOf' から、個人 (学生) からもスローされ、新しい個人として保存されます。

この操作に使用したコードは次のようなものです。

//Add a class to a student 
public void Add_Class
    (string uri_stu, string uri_class)
{        
        //Open RDF
        RdfDocument rdfDoc = new RdfDocument(@"RDF_Repository\RDF_Student.rdf");
        //Find the student
        //Student student = new Student(uri_stu, rdfDoc);
        Student student = (Student)rdfDoc.GetIndividual(uri_stu);
        //Add a class
        student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc);
        rdfDoc.ExportToRdfXml(@"RDF_Repository\RDF_Student.rdf");
}


//Add a project to a student 
public void Add_Project
    (string uri_stu, string uri_proj)
{
        //Open RDF
        RdfDocument rdfDoc = new RdfDocument(@"RDF_Repository\RDF_Student.rdf");
        //Find the student
        Student student = (Student)rdfDoc.GetIndividual(uri_stu);
        //Add a project                        
        student.studyMemberOf = new Project(uri_proj, rdfDoc);
        rdfDoc.ExportToRdfXml(@"RDF_Repository\RDF_Student.rdf");
}

結果の RDF は次のようになります。

<?xml version="1.0"?>
<rdf:RDF xmlns:Ontologyowl="http://www.owl-ontologies.com/Ontology1243411901.owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <Ontologyowl:Student rdf:about="stu000012">
        <Ontologyowl:studyMemberOf>
            <Ontologyowl:Project rdf:about="proj000052"/>
        </Ontologyowl:studyMemberOf>
    </Ontologyowl:Student>
    <Ontologyowl:ClassOfCourse rdf:about="class000021"/>
</rdf:RDF>

...追加を続けると、前のプロパティは破棄されます。では、どうすればこの問題を克服できるでしょうか?

役に立ちましたか?

解決

ROWLEX は、オントロジー クラスごとに、「フル」クラスと「ライト」クラスの 2 つの .NET クラスを生成します。2 つの自動生成クラスは、命名規則によって区別されます。OWLクラスの名前が「Student」の場合、ライトクラスの名前も「Student」になります。完全なクラスの名前は「Student_」です。それらは相互に完全に交換可能であり、2 つを持つことの純粋な目的は利便性です。完全なクラスには、必要なすべてのメソッド/プロパティが含まれています。ライト クラスには、最も頻繁に使用されるクラスのみが含まれています。フルクラスの問題は、非常に混雑することです。単一の OWL プロパティごとに、.NET クラスで 10 (!) のプロパティとメソッドを取得します。

  • 追加 (タイプセーフ)
  • 追加 (タイプセーフではない)
  • 削除 (タイプセーフ)
  • 削除 (タイプセーフではありません)
  • 置換 (タイプセーフ)
  • 置換 (タイプセーフではありません)
  • 非配列プロパティ (タイプセーフ)
  • 非配列プロパティ (タイプセーフではない)
  • 配列プロパティ (タイプセーフ)
  • 配列プロパティ (タイプセーフではない)

対応する OWL プロパティが 5 つだけの場合、自動生成された .NET 完全クラスには 5x10 のメソッド/プロパティが含まれます。このように多数のメンバーが存在すると、インテリセンスの有用性は簡単に無効になります。したがって、一般的には軽量クラスの使用が推奨されます。

ライト クラスでは、非配列プロパティのみが実装されており (カーディナリティ制限が明示的に指示されていない限り)、そのプロパティは内部で replace メソッドを呼び出します。あなたの場合、完全なクラスを使用する必要があります。

これは、完全なクラスを取得して使用する方法です (コードは検証しませんでした)。

Student_ student = (Student_)rdfDoc.GetIndividual(uri_stu, Student.Uri, false);
student.AddstudyMemberOf(new Project(uri_proj, rdfDoc));

他のヒント

私はRowlexに慣れていないんだけど、私は(それはそうと、そうでないか)の問題は、あなたがあなたの新しいstudyMemberOf述語を作成している方法ですよね。

の比較:

student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc);

student.studyMemberOf = new Project(uri_proj, rdfDoc);

あなたは、単一の述語に新しい個人を割り当てるのではなく、同じ述語を持つ新しいステートメント追加していることを示しているように思われる(正確にあなたの質問です - 私はこの答えがどのように役立つか分かりません)。

また、文体ノートに、あなたが(彼らは同じ名前空間を共有している)個人とあなたのオントロジーについてのあなたの文をマージしているようです。それはあなたが別の名前空間内のURI(または匿名ノード)になり、通常はあなたの学生、クラス、およびプロジェクトの個人を望むものはおそらくではありません。たとえばます:

<?xml version="1.0"?>
<rdf:RDF xmlns:Ontologyowl="http://www.owl-ontologies.com/Ontology1243411901.owl#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <Ontologyowl:Student rdf:resource="http://students.uri/stu000012">
        <Ontologyowl:studyMemberOf>
            <Ontologyowl:Project rdf:resource="http://projects.uri/proj000052"/>
        </Ontologyowl:studyMemberOf>
    </Ontologyowl:Student>
    <Ontologyowl:ClassOfCourse rdf:resource="http://classes.uri/class000021"/>
</rdf:RDF>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top