Java 如何从Jena RDF Inf模型中的节点值中获取单个名称

Java 如何从Jena RDF Inf模型中的节点值中获取单个名称,java,sparql,rdf,jena,jena-rules,Java,Sparql,Rdf,Jena,Jena Rules,我面临着从Jena图(带有通用规则推理器和OntSpec的RDF推理模型是RDFS_MEM_RDFS_INF)中提取个人姓名的问题。这可能是一个简单的例子,但我无法在网上找到合适的教程来完成这项工作(耶拿规则的新内容)。在这种情况下,适当的api是什么 infStmts = pModel.listStatements().filterKeep( new Filter<Statement>() { @Override public boolean acc

我面临着从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));
Jena规则文件具有以下规则

[规则:(:Subject1:hasPropertyP2:Object1)->
(?x rdf:类型:Class1)
(?x:hasPropertyP1:Object2)]

我需要个人姓名的?x值

在下一行中,您试图获取主题的名称,然后获取其节点版本,然后获取其个人版本

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()){
语句stmt=stmts.next();
RDFNode subject=stmt.getSubject();
if(subject.isURIResource()){
System.out.println(“主题URI为:+Subject.asResource().getURI());
}
}

您所说的“个人姓名”是什么意思?指定个人的IRI?rdfs:label属性的值?还有别的吗?是的,命名个人的IRI是我想要的。这是我的理解,即空白节点(En.维基百科。org/wiki/BalkgNob)。4e62503a:14b01762f42:-7eea持有满足规则的所需个体集,因此我希望检索包含的数据,在本例中,这些数据是具有hasPropertyP1的个体的数据,或者编写jena规则,以便检索与sparql查询类似的个体“空白节点4e62503a:14b01762f42:-7eea包含满足规则的所需个人集“这没有道理。空白节点不是容器,它只是一个匿名资源。它就像一个IRI资源,除了它没有IRI。如果你找到了这个问题的解决方案,你应该考虑关闭/删除这个。嗨,这是我想要的这个特殊的IdiVIEW(空白节点),因为它是与我查询的属性(对象/数据属性)有关的。是的,所有语句都在这里打印出来,但是我的代码稍后只提取这个特定语句,它的属性是“hasPropertyP1”,它包含节点值而不是iri。如果我写的规则是直接引用个体而不是类的变量?x,我可以得到iri,这很明显,但是我想要所有的类元素,那么如何写jena规则呢?这个节点指的是类Class1中谓词为hasPropertyP1的个体。我想要的不是节点,而是它的组成部分(个体)。这在java代码中是无法做到的,因为我希望它是通用的,因此需要适当地编写规则来获取这些数据。我之前不确定,因此要求调用适当的api,但这似乎是编写的适当规则,以便过滤器将包含包含相应类(Class1)个体的所有语句,而不是类节点本身。我想jena和rdf的规则中有一些约束,那么如何做到这一点呢?@user3747396 Blank节点没有IRIs,这就是为什么它们是空的。我不确定您试图获取空白节点的IRI是什么意思。我不知道你所说的“节点的组成部分”是什么意思。你的意思是你想要一个类的元素吗?我真的不知道你想要什么。是的,我想要满足hasPropertyP1的类的iris(元素)。如果我将规则
(?x rdf:type:Class1)(?x hasPropertyP1:Object2)
更改为
(:Individual1:hasPropertyP1:Object2)
,我可以看到个人,但是如果我必须这样写,我需要为每个相应的个人编写,如果这是做事情的唯一方法,使用本体本身进行分类的整个概念没有多大用处,因为我想通过调整本体类而不是每个个体来调整事情。我想要
:Class1:hasPropertyP1:Object
,并获得令人满意的Class1@user3747396然后,听起来你好像没有试图回答“什么样的人拥有o作为属性p的值?”规则没有提供答案;它们从图形中生成(或删除)三元组。这就是你能做的。