我在项目中使用了rowlex。我有一个属性分配给我的RDF文件中的个人,该文件有一个值。例如,对于个人'学生',有一个属性'isMemberOf',其值为类uri'class00021'。 然后我想为此属性添加第二个值。例如,使用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>
...如果我们继续添加,之前的属性将被抛弃。 那我怎么能克服这个问题呢?
答案 0 :(得分:4)
对于每个本体类,ROWLEX生成两个.NET类,一个“完整”和一个“轻”类。两个自动生成的类通过命名约定来区分。如果你的OWL课程被命名为“学生”,那么光学课程也会被命名为“学生”。完整的课程名为“Student_”。它们完全可以相互交换,两个方面的绝对目的是方便。完整类包含您需要的所有可能的方法/属性。灯类只包含最常用的灯类。完整课程的问题,他们真的很拥挤。对于每个单独的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));
答案 1 :(得分: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>