将多个值分配给属性

问题描述:

我在我的项目中使用了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> 

...如果我们继续增加,以前的属性将是抛出。 那么我该如何克服这个问题呢?

对于每个本体类,ROWLEX都会生成两个.NET类,一个是“全”和一个是“光”。两个自动生成的类通过命名约定来区分。如果你的OWL类被命名为“学生”,那么轻量级也将被命名为“学生”。完整的课程名为“Student_”。它们完全可以互换,二者的纯粹目的是方便。完整的类包含您需要的所有可能的方法/属性。轻类只包含最常用的类。他们真正拥挤的完整课程的问题。对于每个单一的OWL属性,您将在您的系统中获得10个(!)属性和方法。NET类:

  • 添加(类型安全)
  • 添加(不类型安全)
  • 删除(类型安全)
  • 删除(不类型安全)
  • 更换(类型安全)
  • 更换(不类型安全)
  • 非数组属性(typesafe)
  • 非数组属性(不是类型安全)
  • Array属性(类型安全)
  • Array属性(不类型安全)

如果您只有5 OWL属性,以满足,自动生成.NET满级将有5×10方法/属性。这些成员的数量很多很容易打败intellisense的用处。因此,通常建议使用轻质类。

在轻类上,只有非数组属性实现(除非基数限制明确指定),并且该属性在内部调用replace方法。在你的情况下,你需要使用全班。

这是你如何获得并使用完整的类(我没有验证码):

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

非常感谢您的回答。 – Ehsan 2009-07-06 12:57:00

我对Rowlex并不熟悉,但我猜想问题在于如何创建新的谓词(或不是,因为它似乎)。

比较:

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> 
+0

三江源很为你的答案。 我应该说,我试图将2个人分配给物体特性。所以在rdf中,行: Ehsan 2009-07-06 12:56:09