我在我的项目中使用 rowlex 。我的 RDF 文件中有一个分配给个人的属性,它有一个值。例如,对于个人“学生”,有一个属性“isMemberOf”,其值为类 uri“class00021”。 然后我想向该属性添加第二个值。例如,“Project”值的 uri 为“proj000052”。
问题出现在这里:添加第二个值后,第一个值被抛出属性“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 都会生成两个 .NET 类,一个“完整”类和一个“轻量”类。这两个自动生成的类通过命名约定进行区分。如果您的 OWL 类被命名为“Student”,那么 Light 类也将被命名为“Student”。完整的类(class)被命名为“Student_”。它们之间完全可以互换,拥有两个的纯粹目的是方便。完整的类包含您需要的所有可能的方法/属性。轻量级仅包含最常用的。满类的问题是他们真的很拥挤。对于每个 OWL 属性,您将在 .NET 类中获得 10 个(!)属性和方法:
- 添加(类型安全)
- 添加(非类型安全)
- 删除(类型安全)
- 删除(非类型安全)
- 替换(类型安全)
- 替换(非类型安全)
- 非数组属性(类型安全)
- 非数组属性(类型不安全)
- 数组属性(类型安全)
- 数组属性(非类型安全)
如果您只有 5 个 OWL 属性需要满足,则自动生成的 .NET 完整类将具有 5x10 个方法/属性。如此大量的成员很容易削弱智能感知的用处。因此,通常建议使用轻型等级。
在 light 类上,您只实现了非数组属性(除非基数限制明确指示),并且该属性在内部调用替换方法。在您的情况下,您需要使用完整的类(class)。
这是获取和使用完整类的方式(我没有验证代码):
Student_ student = (Student_)rdfDoc.GetIndividual(uri_stu, Student.Uri, false);
student.AddstudyMemberOf(new Project(uri_proj, rdfDoc));
关于rdf - 为属性分配多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078494/