2017-08-24 75 views
1

使用SPIN API(http://topbraid.org/spin/api/)並使用示例代碼https://github.com/spinrdf/spinrdf/blob/master/src-examples/org/topbraid/spin/examples/SPINParsingExample.java我試圖添加對rdfs的處理:comment並旋轉:文本到示例。 Topbraid Composer免費版(TBC FE)確實允許在RDF中包含的每條SPIN規則發表一條評論。 TBC FE還可以通過sp:text屬性將SPIN SPARQL源代碼作爲xsd:string值進行選擇。我想在這個例子的擴展版本中做同樣的事情,然後將其轉移到我想要嵌入SPIN規則編輯的工作代碼中。在文本SPARQL語法和SPIN RDF詞彙之間進行轉換:如何添加rdfs:comment和sp:文本

這是我目前擴展的示例代碼版本。請忽略日誌警告。請注意,我在示例查詢(第54行)頂部插入的評論在輸出中靜默放置(輸出也包含在下面)。從上面的

/* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
* 
* See the NOTICE file distributed with this work for additional 
* information regarding copyright ownership. 
*/ 

package mil.disa.dso.spo.a2i.nsc.sharing2025.raaDemo; 

import org.topbraid.spin.arq.ARQ2SPIN; 
import org.topbraid.spin.arq.ARQFactory; 
import org.topbraid.spin.model.Select; 
import org.topbraid.spin.system.SPINModuleRegistry; 

import org.apache.jena.query.Query; 
import org.apache.jena.rdf.model.Model; 
import org.apache.jena.rdf.model.ModelFactory; 
import org.apache.jena.rdf.model.Property; 
import org.apache.jena.util.FileUtils; 
import org.apache.jena.vocabulary.RDF; 


/** 
* Converts between textual SPARQL representation and SPIN RDF model. 
* 
* @author Holger Knublauch 
*/ 
public class SPINParsingExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     // Register system functions (such as sp:gt (>)) 
     SPINModuleRegistry.get().init(); 

     // Create an empty OntModel importing SP 
     Model model = ModelFactory.createDefaultModel(); 
     model.setNsPrefix("rdf", RDF.getURI()); 
     model.setNsPrefix("ex", "http://example.org/demo#"); 

     String query = 
      "# This is an example SPARQL comment\n" + 
      "SELECT ?person\n" + 
      "WHERE {\n" + 
      " ?person a ex:Person .\n" + 
      " ?person ex:age ?age .\n" + 
      " FILTER (?age > 18) .\n" + 
      "}"; 

     System.out.println("Original SPARQL query string:\n\n" + query); 

     Query arqQuery = ARQFactory.get().createQuery(model, query); 
     ARQ2SPIN arq2SPIN = new ARQ2SPIN(model); 
     Select spinQuery = (Select) arq2SPIN.createQuery(arqQuery, null); 

     // TODO what about the sp:text? It's not in the artifacts printed below... 
     // TODO figure out how to add a comment to the tokenized query... does not propagate from source string above 
     // perhaps this is through and addProperty call to add an rdfs:comment?? many calls, not clear how to use... 
     // get javadoc? 

     System.out.println("\n-----"); 
     System.out.println("SPIN query in Turtle:\n"); 
     model.write(System.out, FileUtils.langTurtle); 

     System.out.println("\n-----"); 
     System.out.println("SPIN query in XML:\n"); 
     model.write(System.out, FileUtils.langXML); 

     System.out.println("\n-----"); 
     String str = spinQuery.toString(); 
     System.out.println("SPIN query:\n\n" + str); 

     // Now turn it back into a Jena Query 
     Query parsedBack = ARQFactory.get().createQuery(spinQuery); 
     System.out.println("Jena query:\n" + parsedBack); 
    } 
} 

輸出...

log4j:WARN No appenders could be found for logger (Jena). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
Original SPARQL query string: 

# This is an example SPARQL comment 
SELECT ?person 
WHERE { 
    ?person a ex:Person . 
    ?person ex:age ?age . 
    FILTER (?age > 18) . 
} 

----- 
SPIN query in Turtle: 

@prefix ex: <http://example.org/demo#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix sp: <http://spinrdf.org/sp#> . 

[ a     sp:Select ; 
    sp:resultVariables ([ sp:varName "person" ] 
        ) ; 
    sp:where   ([ sp:object  ex:Person ; 
          sp:predicate rdf:type ; 
          sp:subject [ sp:varName "person" ] 
         ] 
         [ sp:object  [ sp:varName "age" ] ; 
          sp:predicate ex:age ; 
          sp:subject [ sp:varName "person" ] 
         ] 
         [ a    sp:Filter ; 
          sp:expression [ a  sp:gt ; 
              sp:arg1 [ sp:varName "age" ] ; 
              sp:arg2 18 
             ] 
         ] 
        ) 
] . 

----- 
SPIN query in XML: 

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:ex="http://example.org/demo#" 
    xmlns:sp="http://spinrdf.org/sp#"> 
    <sp:Select> 
    <sp:resultVariables rdf:parseType="Collection"> 
     <rdf:Description> 
     <sp:varName>person</sp:varName> 
     </rdf:Description> 
    </sp:resultVariables> 
    <sp:where rdf:parseType="Collection"> 
     <rdf:Description> 
     <sp:object rdf:resource="http://example.org/demo#Person"/> 
     <sp:predicate rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"/> 
     <sp:subject rdf:parseType="Resource"> 
      <sp:varName>person</sp:varName> 
     </sp:subject> 
     </rdf:Description> 
     <rdf:Description> 
     <sp:object rdf:parseType="Resource"> 
      <sp:varName>age</sp:varName> 
     </sp:object> 
     <sp:predicate rdf:resource="http://example.org/demo#age"/> 
     <sp:subject rdf:parseType="Resource"> 
      <sp:varName>person</sp:varName> 
     </sp:subject> 
     </rdf:Description> 
     <sp:Filter> 
     <sp:expression> 
      <sp:gt> 
      <sp:arg2 rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
      >18</sp:arg2> 
      <sp:arg1 rdf:parseType="Resource"> 
       <sp:varName>age</sp:varName> 
      </sp:arg1> 
      </sp:gt> 
     </sp:expression> 
     </sp:Filter> 
    </sp:where> 
    </sp:Select> 
</rdf:RDF> 

----- 
SPIN query: 

SELECT ?person 
WHERE { 
    ?person a ex:Person . 
    ?person ex:age ?age . 
    FILTER (?age > 18) . 
} 
Jena query: 
SELECT ?person 
WHERE 
    { ?person a      <http://example.org/demo#Person> ; 
      <http://example.org/demo#age> ?age 
    FILTER (?age > 18) 
    } 

我敢肯定,有一個方法來添加一個RDFS:註釋的源代碼(通過SP:文字)到RDF,但我還沒有找到它。我懷疑可以通過示例(第66行)中的spinQuery實例化來調用Select類的方法,但我不知道如何。任何指針將不勝感激。

此問題與我之前回答的問題How to turn a SPARQL/SPIN query/rule into an RDF structure from Java?有關,但專注於RDF中的註釋和源代碼。

回答

1

看來你可以添加rdfs:comment只查詢的詳細RDF形式。 不可能通過rdfs:commentsp:text,因爲最後一個是字符串文字的謂詞,所以只能將它作爲字符串的一部分來執行。看來Topbraid只允許通過RDF圖進行評論,而文本查詢僅在GUI中存在(作爲分離的模型)。建議:以RDF形式保存查詢,在這種情況下,您也不會遇到前綴問題。

示例如何添加rdfs:commentsp:text

public static void main(String ... args) { 
    Model model = ModelFactory.createDefaultModel(); 
    model.setNsPrefix("rdf", RDF.getURI()); 
    model.setNsPrefix("ex", "http://example.org/demo#"); 
    model.setNsPrefix("sp", SP.getURI()); 
    model.setNsPrefix("rdfs", RDFS.getURI()); 

    String query = "SELECT ?person\n" + 
        "WHERE {\n" + 
        " ?person a ex:Person .\n" + 
        " ?person ex:age ?age .\n" + 
        " FILTER (?age > 18) .\n" + 
        "}"; 
    Query arqQuery = ARQFactory.get().createQuery(model, query); 
    ARQ2SPIN arq2SPIN = new ARQ2SPIN(model); 
    Select select1 = (Select) arq2SPIN.createQuery(arqQuery, null); 
    select1.addProperty(RDFS.comment, "Comment1"); // <-- as part of rdf 

    Resource anon = model.createResource(); 
    anon.addProperty(RDF.type, SP.Select); 
    anon.addProperty(SP.text, model.createTypedLiteral(
      "# Comment2\n" + // <-- as part of string 
      "SELECT ?person\n" + 
      "WHERE {\n" + 
      " ?person a ex:Person .\n" + 
      " ?person ex:age ?age .\n" + 
      " FILTER (?age < 22) .\n" + 
      "}")); 
    Select select2 = anon.as(Select.class); 
    System.out.println("========================"); 
    model.write(System.out, "ttl"); 
    System.out.println("========================"); 
    System.out.println("Select1:\n" + select1); 
    System.out.println("Select2:\n" + select2); 
} 

輸出:

======================== 
@prefix ex: <http://example.org/demo#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix sp: <http://spinrdf.org/sp#> . 

_:b0 a    sp:Filter ; 
     sp:expression [ a  sp:gt ; 
         sp:arg1 [ sp:varName "age" ] ; 
         sp:arg2 18 
         ] . 

_:b1 sp:object  [ sp:varName "age" ] ; 
     sp:predicate ex:age ; 
     sp:subject [ sp:varName "person" ] . 

[ a     sp:Select ; 
    rdfs:comment  "Comment1" ; 
    sp:resultVariables (_:b2) ; 
    sp:where   (_:b3 _:b1 _:b0) 
] . 

_:b3 sp:object  ex:Person ; 
     sp:predicate rdf:type ; 
     sp:subject [ sp:varName "person" ] . 

_:b2 sp:varName "person" . 

[ a  sp:Select ; 
    sp:text "# Comment2\nSELECT ?person\nWHERE {\n ?person a ex:Person .\n ?person ex:age ?age .\n FILTER (?age < 22) .\n}" 
] . 
======================== 
Select1: 
# Comment1 
SELECT ?person 
WHERE { 
    ?person a ex:Person . 
    ?person ex:age ?age . 
    FILTER sp:gt(?age, 18) . 
} 
Select2: 
# Comment2 
SELECT ?person 
WHERE { 
    ?person a ex:Person . 
    ?person ex:age ?age . 
    FILTER (?age < 22) . 
} 
+0

,我一直在尋找的關鍵語句是'select1.addProperty(RDFS.comment, 「註釋1」) ;'謝謝! –

相關問題