鉴于昨天的结论,今天在本体中补上了几个子属性关系、传递关系,想验证一下Jena API的推理功能:
我在旅游本体中加入了一个新类“#旅游目的地”,我按照特色的不同建了五个子类“#避暑胜地”、“#另类生活胜地”、“#娱乐胜地”、“#摄影胜地”、“#历史文化胜地”。在"#避暑胜地类"中添加了一个约束——属性“#具有”allValuesFrom“#自然山水景点”,"#自然山水景点"是"#景点"类的一个子类,它有实例"#庐山烟雨朦胧".。这样,通过说明“#旅游目的地”的一个实例“#江西”,
具有地区“#庐山”,而“#庐山”
具有景点“庐山烟雨朦胧”,而得到“#江西”
具有“#庐山烟雨朦胧”,因为“#具有”是transitive属性(具有景点和具有地区是具有的子属性)。我想得到的推理结果是
1. “#江西" "#具有" "#庐山烟雨朦胧"
2.“#江西” rdf:type "#避暑胜地"。
这样讲比较混乱,下面是部分owl文件(可点击这里下载完整文件):
这是避暑胜地的定义:
<owl:Class rdf:ID="避暑胜地">
<rdfs:subClassOf rdf:resource="#旅游目的地"/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:hasValue>
<owl:Class rdf:ID="自然山水景点"/>
</owl:hasValue>
<owl:onProperty>
<owl:TransitiveProperty rdf:about="#具有"/>
</owl:onProperty>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
这是个体江西的数据:
<旅游目的地 rdf:ID="江西">
<具有地区>
<地区 rdf:ID="庐山">
<具有景点>
<自然山水景点 rdf:ID="庐山烟雨朦胧">
<景点简介 rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
>几千万年前的地壳运动,造就了庐山叠障九层、崇岭万仞的赫赫气势,伴生出峰诡不穷、怪石不绝的刚阳之美。由于庐山高耸于江湖之间,雨量丰富,年降水量可达1950一2000毫米,故山中温差大,云雾多,千姿百态,变幻无穷。到庐山旅游,不可不体味庐山的云雾之美!到此消暑,环境幽静,烦热顿消,成为全国著名的避暑胜地。这里空气清新,森林、花鸟、温泉和众多的别墅群以及大量的历史名人骚客留下许多壮美诗篇和名胜古迹、神仙洞府,形成庐山完善的休闲度假地形象。</景点简介>
<景点位于 rdf:resource="#庐山"/>
<景点星级 rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
>4</景点星级>
</自然山水景点>
</具有景点>
<地区位于 rdf:resource="#江西"/>
</地区>
</具有地区>
</旅游目的地>
然后,我编了一小段代码测试,我选择的是OntModelSpec.OWL_DL_MEM_RULE_INF推理功能,结果发现并不能推出江西是个避暑胜地的结论,我反复检查了我的本体,仍然找不出问题所在,是我的本体不完整,还是Jena推理功能的问题?我还是偏向于前面的原因,因为计算机本体中用Jena的确可以推出WhiteBozZX是个GamingComputer结论,但在那个例子中是用的InfModel。OntModel应该是比InfModel更强推理能力才是,为什么会推不出来呢?下面是推出的关于“江西”的结论:
江西 * :
- (http://www.owl-ontologies.com/unnamed.owl#江西 rdf:type http://www.owl-ontologies.com/unnamed.owl#旅游目的地)
- (http://www.owl-ontologies.com/unnamed.owl#江西 http://www.owl-ontologies.com/unnamed.owl#具有地区 http://www.owl-ontologies.com/unnamed.owl#庐山)
- (http://www.owl-ontologies.com/unnamed.owl#江西 rdf:type rdfs:Resource)
- (http://www.owl-ontologies.com/unnamed.owl#江西 owl:sameAs http://www.owl-ontologies.com/unnamed.owl#江西)
- (http://www.owl-ontologies.com/unnamed.owl#江西 rdf:type owl:Thing)
- (http://www.owl-ontologies.com/unnamed.owl#江西 http://www.owl-ontologies.com/unnamed.owl#具有 http://www.owl-ontologies.com/unnamed.owl#庐山)
- (http://www.owl-ontologies.com/unnamed.owl#江西 http://www.owl-ontologies.com/unnamed.owl#具有 http://www.owl-ontologies.com/unnamed.owl#庐山烟雨朦胧)
Failed to recognized 江西 correctly
可见,可以推出第一个结论:江西具有庐山烟雨朦胧(传递属性),但无法推出江西是个避暑胜地的结果。原因还需进一步分析。
另外,有感于Jena推理功能的薄弱,我只有用*_RULE_INF才能推出第一个结论,而如果用其余几个,只能得到子类、子属性有关的推理,难道本体的推理只是这种程度,自然不能满足实际应用的需要。还是考虑一下外挂推理机吧。