我面临从Jena Graph中提取Individual名称的问题(使用通用规则推理器的RDF推理模型和OntSpec是RDFS_MEM_RDFS_INF)。这可能是一个简单的案例,但我无法在网上找到适当的教程来完成这项工作(jena规则新手)。在这种情况下,要求的api是什么?
infStmts = pModel.listStatements().filterKeep( new Filter<Statement>() {
@Override
public boolean accept(Statement o) {
boolean ex = false;
Property prop1 = pModel.getProperty(prefix + "hasPropertyP1");
String predicateName = o.asTriple().getPredicate().getLocalName();
if(predicateName.equalsIgnoreCase(prop1.getLocalName()) )
ex = true;
return ex;
}
});
Statement s = infStmts.next();
Statement st = ResourceFactory.createStatement(s.getSubject(), s.getPredicate(), s.getObject());
System.out.println(st.getSubject().toString() + "****" + pModel.getRDFNode(st.getSubject().asNode()).as(Individual.class));
Exception in thread "Thread-37" com.hp.hpl.jena.ontology.ConversionException: Cannot convert node 4e62503a:14b01762f42:-7eea to Individual
at com.hp.hpl.jena.ontology.impl.IndividualImpl$1.wrap(IndividualImpl.java:61)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:152)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:31)
at com.hp.hpl.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:62)
at com.hp.hpl.jena.enhanced.EnhNode.as(EnhNode.java:107)
...
Jena规则文件具有以下规则
[rule: ( :Subject1 :hasPropertyP2 :Object1) ->
( ?x rdf:type :Class1)
( ?x :hasPropertyP1 :Object2)]
我需要根据个人姓名<?p>的价值
答案 0 :(得分:3)
在下面一行中,您尝试获取主题,然后获取它的Node版本,然后获取它的个人版本。
System.out.println(st.getSubject().toString() + "****" + pModel.getRDFNode(st.getSubject().asNode()).as(Individual.class));
您正在为图中每个三元组的主题执行此操作。 Individual的文档说:
为了被认可为个人,而不是通用 资源,至少一个rdf:type语句,引用已知类, 必须存在于模型中。
您收到的错误消息
无法将节点4e62503a:14b01762f42:-7eea转换为个人
表示在图表的某处,有一个三元组,其主题是一个空白节点。显然,其中一个空白节点不符合个人标准。在执行 as(Individual.class)之前,您需要检查节点是否可以是个体。您可以先使用 canAs(Individual.class)进行检查。
但是,您需要注意,仅仅因为规则文件只有一个规则并不意味着推理图中的所有三元组都将由它生成。推理图中可能有更多的三元组。
执行您尝试执行的操作的更好方法是使用 Model.listStatements 列出包含您关注的属性的语句,然后检查主题是否是URI资源,如果是,则将其作为URI资源获取并提取其URI:
Property p1 = model.createProperty(...)
StmtIterator stmts = model.listStatements(null,p1,null);
while ( stmts.hasNext() ) {
Statement stmt = stmts.next();
RDFNode subject = stmt.getSubject();
if ( subject.isURIResource() ) {
System.out.println( "Subject URI is: "+ subject.asResource().getURI() );
}
}