Rdf 为属性指定多个值

Rdf 为属性指定多个值,rdf,rowlex,Rdf,Rowlex,我正在我的项目中使用rowlex。在我的RDF文件中,我有一个分配给个人的属性,它有一个值。例如,对于单个“Student”,有一个属性“isMemberOf”,其值为类uri“class00021”。 然后我想给这个属性添加第二个值。例如,uri为“proj000052”的“Project”值 问题出现在这里:添加第二个值后,第一个值从属性“isMemberOf”中抛出,甚至从其个体(student)中抛出,并作为新个体存储 我用于此操作的代码如下所示: //Add a class to a

我正在我的项目中使用rowlex。在我的RDF文件中,我有一个分配给个人的属性,它有一个值。例如,对于单个“Student”,有一个属性“isMemberOf”,其值为类uri“class00021”。 然后我想给这个属性添加第二个值。例如,uri为“proj000052”的“Project”值

问题出现在这里:添加第二个值后,第一个值从属性“isMemberOf”中抛出,甚至从其个体(student)中抛出,并作为新个体存储

我用于此操作的代码如下所示:

//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");
}
<?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>
结果RDF如下所示:

//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");
}
<?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不太熟悉,但我想问题在于如何创建新的
studyMemberOf
谓词(或者不,看起来)

比较:

student.studyMemberOf = new ClassOfCourse(uri_class, 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>

对于每个本体类,ROWLEX都会生成两个.NET类,一个是“full”类,一个是“light”类。这两个自动生成的类通过命名约定进行区分。如果您的OWL类被命名为“学生”,那么light类也将被命名为“学生”。全班名为“学生”。它们完全可以相互交换,拥有两个的纯粹目的是为了方便。完整类包含您需要的所有可能的方法/属性。light类只包含最常用的类。全班上课的问题是,他们变得非常拥挤。对于每个OWL属性,您将在.NET类中获得10个(!)属性和方法:

  • 添加(类型安全)
  • 添加(非类型安全)
  • 移除(类型安全)
  • 移除(非类型安全)
  • 替换(类型安全)
  • 替换(非类型安全)
  • 非数组属性(类型安全)
  • 非数组属性(非类型安全)
  • 数组属性(类型安全)
  • 数组属性(非类型安全)
如果您只有5个OWL属性需要满足,那么自动生成的.NET完整类将有5x10个方法/属性。这些高数量的成员很容易挫败intellisense的效用。因此,一般建议使用轻等级

在light类上,您只实现了non-array属性(除非基数限制明确指示其他内容),并且该属性在内部调用replace方法。在您的情况下,您需要使用完整的类

这就是获取和使用完整类的方式(我没有验证代码):


非常感谢你的回答。我应该说,我正试图将两个人分配给一个对象属性。所以在rdf中,这句话是:非常感谢你的回答。