2013-07-28 2 views
1

저는 Jena에 익숙하며 Java에 많은 경험이 없습니다. 모델에서 명령문을 삭제하는 프로그램을 만들려고합니다. (그래프를 사용하고 SPARUL 쿼리를 실행하는 대체 방법에 대해 알고 있지만 대신 모델을 사용하고 싶습니다.) 나는 model.remove (statement)를 사용해 보았지만, 제대로하지 못하고있는 것 같다. 위의 방법의 예를 검색했지만 찾지 못했습니다. 누군가 내가 잘못하고있는 곳에서 나를 도울 수 있습니까? 한 문장을 삭제하는 것으로 시작하고 싶습니다. 그 후에 여러 문장을 지우고 싶습니다. 아래 코드를 포함합니다. 덕분에 도움을 사전에Jena에서 model.remove (statement) 사용하기

 import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Calendar; 
import java.util.Date; 

import com.hp.hpl.jena.query.Query; 
import com.hp.hpl.jena.query.QueryExecution; 
import com.hp.hpl.jena.query.QueryExecutionFactory; 
import com.hp.hpl.jena.query.QueryFactory; 
import com.hp.hpl.jena.query.ResultSet; 
import com.hp.hpl.jena.query.ResultSetFormatter; 
import com.hp.hpl.jena.rdf.model.Model; 
import com.hp.hpl.jena.rdf.model.ModelFactory; 
import com.hp.hpl.jena.rdf.model.Resource; 
import com.hp.hpl.jena.rdf.model.ResourceFactory; 
import com.hp.hpl.jena.util.FileManager; 
import com.hp.hpl.jena.vocabulary.VCARD; 

public class Test3 extends Object { 

public static void main(String[] args) throws IOException { 

    final String inputFileName = "vc-db-1.rdf"; 
    Model model = ModelFactory.createDefaultModel(); 

    InputStream in = FileManager.get().open(inputFileName); 
    if (in == null) { 
     throw new IllegalArgumentException ("File: " + inputFileName + " not found"); 
    } 

     model.read(new InputStreamReader(in), ""); 
    in.close(); 

    System.out.println("== Before removal =="); 
    model.write(System.out); 

    System.out.println("\n\n== After removal =="); 



    model.remove(model.createResource("http://somewhere/JohnSmith"), 
      VCARD.FN, // or ResourceFactory.createProperty("http://www.w3.org/2001/vcard-rdf/3.0#FN"); 
      ResourceFactory.createTypedLiteral("John Smith")); 
    model.write(System.out); 
} 

} 

출력은

== Before removal == 
    <rdf:RDF 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" > 

.....Other statements 
     <rdf:Description rdf:about="http://somewhere/JohnSmith/"> 
     <vCard:N rdf:nodeID="A3"/> 
     <vCard:FN>John Smith</vCard:FN> 
     </rdf:Description> 
     <rdf:Description rdf:nodeID="A3"> 
     <vCard:Given>John</vCard:Given> 
     <vCard:Family>Smith</vCard:Family> 
     </rdf:Description> 
    </rdf:RDF> 


    == After removal == 
    <rdf:RDF 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" > 
...Other Statements 
     <rdf:Description rdf:about="http://somewhere/JohnSmith/"> 
     <vCard:N rdf:nodeID="A3"/> 
     <vCard:FN>John Smith</vCard:FN> 
     </rdf:Description> 
     <rdf:Description rdf:nodeID="A3"> 
     <vCard:Given>John</vCard:Given> 
     <vCard:Family>Smith</vCard:Family> 
     </rdf:Description> 
    </rdf:RDF> 

을 다음과 어떻게 든 문을 삭제 한 후 모델의 변경 사항을 '확인은/커밋'해야합니까?

답변

2

표시중인 데이터와 프로그램에서 만드는 리소스가 다릅니다. 프로그램에서 생성되는 자원이

http://somewhere/JohnSmith 

하지만 데이터, 그것은이 /를 후행

http://somewhere/JohnSmith/ 

을합니다. 이것이 해결되면, 당신은 다음 코드와 같이 트리플을 제거 할 수 있습니다

import java.io.ByteArrayInputStream; 

import com.hp.hpl.jena.rdf.model.Model; 
import com.hp.hpl.jena.rdf.model.ModelFactory; 
import com.hp.hpl.jena.vocabulary.VCARD; 

public class RemoveStatementExample { 
    public static void main(String[] args) { 
     final String n3content = "" + 
       "@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n" + 
       "@prefix vCard: <http://www.w3.org/2001/vcard-rdf/3.0#> .\n" + 
       "<http://somewhere/JohnSmith/>\n" + 
       " vCard:FN \"John Smith\" ;\n" + 
       " vCard:N [ vCard:Family \"Smith\" ;\n" + 
       "   vCard:Given \"John\"\n" + 
       "   ] .\n" + 
       ""; 
     final Model model = ModelFactory.createDefaultModel() 
          .read(new ByteArrayInputStream(n3content.getBytes()), null, "N3"); 

     // before removal 
     System.out.println("== before removal =="); 
     model.write(System.out, "N3"); 

     // remove the statement. Note that in your data, "John Smith" is an 
     // *untyped* literal, so we use createLiteral("John Smith") rather than 
     // createTypedLiteral("John Smith"). 
     model.remove(model.createResource("http://somewhere/JohnSmith/"), 
         VCARD.FN, 
         model.createLiteral("John Smith")); 

     System.out.println("\n\n== after removal =="); 
     model.write(System.out, "N3"); 
    } 
} 

출력은 다음과 같습니다

== before removal == 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix vCard: <http://www.w3.org/2001/vcard-rdf/3.0#> . 

<http://somewhere/JohnSmith/> 
     vCard:FN "John Smith" ; 
     vCard:N [ vCard:Family "Smith" ; 
       vCard:Given "John" 
       ] . 


== after removal == 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix vCard: <http://www.w3.org/2001/vcard-rdf/3.0#> . 

<http://somewhere/JohnSmith/> 
     vCard:N [ vCard:Family "Smith" ; 
       vCard:Given "John" 
       ] . 
+0

감사 여호수아, 내가 속성을 생성하지 않고 문을 삭제할 수있는 방법이 있나요 또는 자원? RDF 파일을 모델로 읽어 들인 다음 특정 문을 삭제하고 싶습니다 (SQL의 delete 문을 사용하는 것과 같습니다). 감사. – Syed

+0

@Syed 'null'을 와일드 카드로 사용할 수 있지만 삭제할 문장을 식별 할 수있는 방법을 제공해야합니다. 삭제할 항목을 어떻게 알 수 있습니까? 위의 예제에서 URI에 직접 코드를 작성하려고 시도하고 예제를 수정하려고하면 'new Resource (http : // somewhere/JohnSmith ", ...)로 포장해야합니다. . 어떤 진술을 실제로 삭제 하시겠습니까? –

+0

@Syed 필자는 예를 기반으로 사용하고자하는 것처럼 보이는 'remove'에 대한 특정 호출을 보여주기 위해 응답을 업데이트했습니다. –

관련 문제