2

我在我的项目中使用 rowlex。我在我的 RDF 文件中为个人分配了一个属性,该属性具有一个值。例如,对于个人“学生”,有一个属性“isMemberOf”,类 uri 的值为“class00021”。然后我想为这个属性添加第二个值。例如,带有 uri 'proj000052' 的 'Project' 值。

问题出现在这里:添加第二个值后,第一个值被抛出属性'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 生成两个 .NET 类,一个“完整”类和一个“轻量级”类。这两个自动生成的类通过命名约定来区分。如果您的 OWL 课程被命名为“Student”,那么灯光课程也将被命名为“Student”。全班名为“Student_”。它们完全可以相互交换,拥有两个的纯粹目的是方便。完整的类包含您需要的所有可能的方法/属性。light 类仅包含最常用的类。全班的问题是他们真的很拥挤。对于每个 OWL 属性,您将在 .NET 类中获得 10 个(!)属性和方法:

  • 添加(类型安全)
  • 添加(非类型安全)
  • 删除(类型安全)
  • 删除(不是类型安全的)
  • 替换(类型安全)
  • 替换(不是类型安全的)
  • 非数组属性(类型安全)
  • 非数组属性(非类型安全)
  • 数组属性(类型安全)
  • 数组属性(非类型安全)

如果您只有 5 个 OWL 属性需要满足,那么自动生成的 .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 回答