2

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

問題はここに現れます: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>

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

4

2 に答える 2

4

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

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

対応する OWL プロパティが 5 つしかない場合、自動生成された .NET フル クラスには 5x10 のメソッド/プロパティがあります。これらの多数のメンバーは、インテリセンスの有用性を簡単に打ち負かします。したがって、一般的にライト クラスの使用が推奨されます。

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

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

Student_ student = (Student_)rdfDoc.GetIndividual(uri_stu, Student.Uri, false);
student.AddstudyMemberOf(new Project(uri_proj, rdfDoc));
于 2009-07-03T21:07:58.313 に答える
0

私は 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>
于 2009-07-03T16:35:14.123 に答える