通过model的liststatement获取的是所有在该本体文件中的所有断言statement
然后一个断言都是由主谓宾的形式存在的
通过statement的方法可以获取所有的
s : getSubject() 返回一个Resource extends RDFNode
p : getPredicate() 返回一个Property extends Resource extends RDFNode
o : getObject() 返回一个RDFNode
例如:
<owl: DatatypeProperty rdf:about="#age">
<rdfs:domain rdf:resource="#staff"/>
<rdfs:range rdf:resource="&xsd;integer"/>
</owl: DatatypeProperty>
该范例中:
如果通过一个model的liststatement来获取的所有断言,那么其中就包含了
liststatement获取的statement
针对一个sta:name资源就大概包括如下三个statement:
sta:name rdf:type owl:datatypeProperty
sta:name rdf:range owl:string
sta:name rdf:domain sta:staff
所以在第一次循环的时候就可以name这个属性获取主谓宾时,主语获取3次,
谓语获取3次,宾语获取3次,以下是分别3次获取到的数据
代码:
StmtIterator iterator = model.listStatements();
List<String> strlist=new ArrayList<String>();
Statement node;
Resource s;
Property p;
RDFNode o;
//假设获取到sta:name 这个statement的时候
while(iterator.hasNext()){
node=iterator.next(); //获取到的statement
s = node.getSubject(); //3次都是name
p = node.getPredicate(); // type range domain 3次
o=node.getObject(); //datatypeProperty string staff 3次
}
需要保存的结果是:
同一个主语:
获取谓语为type 断言的主语,主要为了找到具体哪个owl类型的属性,例如:datatypeproperty或者是ObjectProperty
获取谓语为range 断言的宾语 主要是为了获取如 string,integer之类的类型
while虚拟循环: 分别每个statement所表示的断言如下 注意:对照上面代码中的 s p o,主要看sta:name
...
sta:age rdf:type owl: DatatypeProperty
sta:name rdf:type owl: datatypeProperty
sta:name rdf:domain sta:staff
sta:address rdf:type owl: DatatypeProperty
sta:name rdf:range owl:string
...
可以看出单主语为name的时候是作为循环的3次出现的,由于出现的顺序不是一定的,
所以不能进行当主语为name,谓语为rdf:type的时候 记录主语
然后在当循环到主语为name谓语为range的时候记录宾语
浙公网安备 33010602011771号