2017-07-28 5 views
2

私は、unionOfとintersectionOfのために、グラフにいくつかの匿名/空白ノードも含まれているApache JenaのAPIを使用しています。そのような例の1つは、匿名ノード/リソースであるJenaの匿名/空白ノードのトラバーサル

<owl:Class> 
    <owl:unionOf rdf:parseType="Collection"> 
     <rdf:Description rdf:about="http://www.summyUrl.com/something#Entity1"/> 
     <rdf:Description rdf:about="http://www.summyUrl.com/something#Entity2"/> 
    </owl:unionOf> 
</owl:Class> 

です。私は上の例外のため(たとえば、URIを使用してSPARQLクエリを行うことができるでもないよ「-1b8b -50a5734d:15d839467d9」

:私はそのURIを取得しようとすると、それはのようなものですそのようなURIを解析する)、それを処理する適切なJenaメソッドを見つけることができません。

私は、そのようなノードを爆発させ、そのノードのすべてのネストされたリソースを取得する方法を探しています。

以下の場合例えば、それは<http:/.../Entity1><http:/.../Entity2><http:/.../Entity3>

<owl:Class> 
    <owl:unionOf rdf:parseType="Collection"> 
     <rdf:Description rdf:about="http://www.summyUrl.com/something#Entity1"/> 
     <owl:unionOf rdf:parseType="Collection"> 
      <rdf:Description rdf:about="http://www.summyUrl.com/something#Entity2"/> 
      <rdf:Description rdf:about="http://www.summyUrl.com/something#Entity3"/> 
     </owl:unionOf> 
    </owl:unionOf> 
</owl:Class> 
  1. それを処理するためのイエナのいずれかの作り付けの方法がありますを返す必要がありますか?

  2. もしそうでない場合は、効率的に行うにはどうすればよいですか?

    イエナモデル-APIを使用
+0

あなたは常にRDF/XMLつのデータのタートルのシリアライズではないはずです。次に、SPARQLプロパティパスを使用できることがわかります。実際には任意のネストされたクラスでは機能しませんが、OWLのようにOWLの推論者が行く方法です – AKSW

+0

最初に全体のクエリを見るのは良いでしょうが、原則として共通パターンは '?subclass rdfs:subClassOf OWLのクラスの和集合で定義されたスーパークラスを探している場合は、/(owl:unionOf/rdf:rest */rdf:first)+? – AKSW

答えて

3

を処理する方法はたくさんあります私はこの方法でそれをやってみました、それがうまく働いた:

/** 
* 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; 
} 
1

 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); 

出力:

http://www.summyUrl.com/something#Entity1 
http://www.summyUrl.com/something#Entity2 
http://www.summyUrl.com/something#Entity1 

これはほんの一例です。何

関連する問題