1

我在从 Jena 图中提取个人姓名时遇到问题(具有通用规则推理器和 OntSpec 的 RDF 推理模型是 RDFS_MEM_RDFS_INF )。这可能是一个简单的案例,但我无法在网上找到合适的教程来完成这项工作(耶拿规则的新手)。在这种情况下需要调用什么正确的 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)]

我需要 ?x 在个人姓名方面的值

4

1 回答 1

3

在下一行中,您尝试获取主题,然后获取它的节点版本,然后获取它的个人版本。

System.out.println(st.getSubject().toString() + "****" + pModel.getRDFNode(st.getSubject().asNode()).as(Individual.class));

您正在为图表中每个三元组的主题执行此操作。个人的文档说:

为了被识别为个体而不是通用资源,模型中必须存在至少一个引用已知类的 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() );
  }
}
于 2015-01-20T00:35:38.527 回答