Java 在Jena中遍历匿名/空白节点

Java 在Jena中遍历匿名/空白节点,java,sparql,jena,semantic-web,blank-nodes,Java,Sparql,Jena,Semantic Web,Blank Nodes,我使用的是ApacheJena的API,由于unionOf和intersectionOf,图中还包含一些匿名/空白节点。其中一个例子是: 这是一个匿名节点/资源。当我尝试获取其URI时,它类似于: -50a5734d:15d839467d9:-1b8b 由于解析此类URI时出现异常,我无法使用此类URI执行SPARQL查询,也无法找到适当的Jena方法来处理它 我正在寻找一种方法来分解这些节点,并获取其中所有嵌套的资源 例如,在下面的情况下,它应该返回,并且 耶拿有什么内在的方法来处理它吗 如果

我使用的是ApacheJena的API,由于unionOf和intersectionOf,图中还包含一些匿名/空白节点。其中一个例子是:

这是一个匿名节点/资源。当我尝试获取其URI时,它类似于:

-50a5734d:15d839467d9:-1b8b

由于解析此类URI时出现异常,我无法使用此类URI执行SPARQL查询,也无法找到适当的Jena方法来处理它

我正在寻找一种方法来分解这些节点,并获取其中所有嵌套的资源

例如,在下面的情况下,它应该返回,并且

耶拿有什么内在的方法来处理它吗

如果没有,我如何才能有效地做到这一点

使用jena模型api:

        String s = "<rdf:RDF\n" +
            "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n" +
            "    xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n" +
            "    xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" +
            "    xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" +
            "    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\">\n" +
            "  <owl:Ontology/>\n" +
            "  <owl:Class>\n" +
            "    <owl:unionOf rdf:parseType=\"Collection\">\n" +
            "      <owl:Class rdf:about=\"http://www.summyUrl.com/something#Entity1\"/>\n" +
            "      <owl:Class>\n" +
            "        <owl:unionOf rdf:parseType=\"Collection\">\n" +
            "          <owl:Class rdf:about=\"http://www.summyUrl.com/something#Entity1\"/>\n" +
            "          <owl:Class rdf:about=\"http://www.summyUrl.com/something#Entity2\"/>\n" +
            "        </owl:unionOf>\n" +
            "      </owl:Class>\n" +
            "    </owl:unionOf>\n" +
            "  </owl:Class>\n" +
            "</rdf:RDF>";
    Model m = ModelFactory.createDefaultModel();
    try (InputStream in = new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8))) {
        m.read(in, Lang.RDFXML.getLabel());
    }
    //m.write(System.out, "ttl");
    m.listStatements()
            .mapWith(Statement::getObject)
            .filterKeep(RDFNode::isURIResource)
            .mapWith(RDFNode::asResource)
            .filterDrop(OWL.Class::equals)
            .filterDrop(OWL.Ontology::equals)
            .filterDrop(RDF.nil::equals)
            .mapWith(Resource::getURI)
            .forEachRemaining(System.out::println);

这只是一个例子。有很多方法可以处理任何事情

我试着用这种方法处理,效果很好:

/**
 * Explodes <b>Anonymous resource</b> (Collection resource) in recursive way and provides
 * nested resources. Mainly considers <code>owl:unionOf</code>, <code>owl:intersactionOf</code>, <code>rdf:first</code> and <code>rdf:rest</code>
 * while traversing.
 * 
 * @param resource
 * @return LinkedList<Resource>
 */
private List<Resource> explodeAnonymousResource(Resource resource)
{
    private static List<Property> collectionProperties = new LinkedList<Property>(Arrays.asList(OWL.unionOf,OWL.intersectionOf,RDF.first,RDF.rest));

    List<Resource> resources=new LinkedList<Resource>();
    Boolean needToTraverseNext=false;

    if(resource.isAnon())
    {
        for(Property cp:collectionProperties)
        {
            if(resource.hasProperty(cp) && !resource.getPropertyResourceValue(cp).equals(RDF.nil))
            {
                Resource nextResource=resource.getPropertyResourceValue(cp);
                resources.addAll(explodeAnonymousResource(nextResource));

                needToTraverseNext=true;
            }
        }

        if(!needToTraverseNext)
        {
            resources.add(resource);
        }
    }
    else
    {
        resources.add(resource);
    }

    return resources;
}

您应该始终关注数据的序列化,而不是RDF/XML序列化。然后您将看到可以使用SPARQL属性路径。事实上,这对任意嵌套类不起作用,但由于它是OWL,所以OWL推理器是一种方法,最好先查看整个查询,但原则上,如果要查找由OWL中的类的并集定义的超类,则常见的模式是?子类rdfs:Subassof/OWL:unionOf/rdf:rest*/rdf:first+?超类。
/**
 * Explodes <b>Anonymous resource</b> (Collection resource) in recursive way and provides
 * nested resources. Mainly considers <code>owl:unionOf</code>, <code>owl:intersactionOf</code>, <code>rdf:first</code> and <code>rdf:rest</code>
 * while traversing.
 * 
 * @param resource
 * @return LinkedList<Resource>
 */
private List<Resource> explodeAnonymousResource(Resource resource)
{
    private static List<Property> collectionProperties = new LinkedList<Property>(Arrays.asList(OWL.unionOf,OWL.intersectionOf,RDF.first,RDF.rest));

    List<Resource> resources=new LinkedList<Resource>();
    Boolean needToTraverseNext=false;

    if(resource.isAnon())
    {
        for(Property cp:collectionProperties)
        {
            if(resource.hasProperty(cp) && !resource.getPropertyResourceValue(cp).equals(RDF.nil))
            {
                Resource nextResource=resource.getPropertyResourceValue(cp);
                resources.addAll(explodeAnonymousResource(nextResource));

                needToTraverseNext=true;
            }
        }

        if(!needToTraverseNext)
        {
            resources.add(resource);
        }
    }
    else
    {
        resources.add(resource);
    }

    return resources;
}