将多个值分配给属性
我在我的项目中使用了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));
我对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>
三江源很为你的答案。 我应该说,我试图将2个人分配给物体特性。所以在rdf中,行:
非常感谢您的回答。 – Ehsan 2009-07-06 12:57:00