检索 OWL 类实例的属性值时出现问题
-
10-07-2019 - |
题
我有一些有实例的猫头鹰类。这些类还具有对每个实例都有价值的属性。我用Protege3.4制作了本体,并用Rowlex制作了c#库。
例如,“程序”类具有“软件”和“atGrade”属性的实例。此实例的属性值为“PHD”(atGrade 是将域映射到成绩类的对象属性)。这是猫头鹰:
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Program">
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Student"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Teacher"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Rank"/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#atGrade"/>
</owl:onProperty>
<owl:allValuesFrom rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Grade"/>
</owl:Restriction>
</rdfs:subClassOf>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Course"/>
<owl:disjointWith>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#LearningResource"/>
</owl:disjointWith>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Note"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#ClassOfCourse"/>
<owl:equivalentClass>
<owl:Class>
<owl:oneOf rdf:parseType="Collection">
<Program rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Management">
<atGrade rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#PHD"/>
</Program>
<Program rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Literature">
<atGrade rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#PHD"/>
</Program>
<Program rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Software">
<atGrade rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#MasterOfResearch"/>
</Program>
<Program rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Information_Technology">
<atGrade rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#MasterOfScience"/>
</Program>
</owl:oneOf>
</owl:Class>
</owl:equivalentClass>
<owl:disjointWith>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Project"/>
</owl:disjointWith>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Grade"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#ResourceType"/>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Language"/>
<rdfs:comment xml:lang="en">Study branch in which the members are working (e.g. MBA)</rdfs:comment>
<owl:disjointWith>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Discussion"/>
</owl:disjointWith>
<owl:disjointWith rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Question"/>
</owl:Class>
atGrade 属性也在本体中定义:
<owl:ObjectProperty rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#atGrade">
<rdfs:range rdf:resource="http://www.owl-ontologies.com/Ontology1243411901.owl#Grade"/>
<rdfs:domain>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Program"/>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Teacher"/>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Project"/>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Course"/>
<owl:Class rdf:about="http://www.owl-ontologies.com/Ontology1243411901.owl#Student"/>
</owl:unionOf>
</owl:Class>
</rdfs:domain>
</owl:ObjectProperty>
现在,当我在 c# 中创建实例之一时,例如:
Program prog = new Program("http://www.owl-ontologies.com/Ontology1243411901.owl#Management", new RdfDocument());
atGrade 属性返回 null。我做了以下操作,但问题没有解决:
-做了一个完整的课程(新的Program_(...))
-输入现有的 RDF 文件:新程序(uri,new RdfDocument(uri))。
-从本体中删除了“rdfs:subClassOf”标签。
有什么想法可以解决这个问题吗?
也许我应该从本体中删除实例并将它们插入到 RDF 中,然后从那里检索它们?
解决方案
您在本体中规定哪些个体符合您的程序类别。如果某个个体的 URI 是您枚举的 URI 之一并且具有适当的 atGrade 属性,则该个体是“计划”。
当您创建 RdfDocument 并创建新的 Program 实例时,您将获得的只是一个三元组,例如“myUri typeof Program”。ROWLEX 不会按照您的预期填写默认值并添加额外的 atGrade 属性。这就是为什么当您检索该属性时会得到 null 的原因。您需要将 atGrade 属性添加到个人中,否则它甚至不是有效的程序实例。
不隶属于 StackOverflow