1

我是 Jena 的新手,对 Java 没有太多经验。我正在尝试制作一个从模型中删除语句的程序。(我知道使用图形和运行 SPARUL 查询的替代方法,但我想改用模型)。我曾尝试使用 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>

删除语句后,我是否需要以某种方式“确认/提交”对模型的更改?

4

1 回答 1

3

您显示的数据和您在程序中创建的资源是不同的。在您的程序中,正在创建的资源是

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"
              ] .
于 2013-07-29T02:47:11.887 回答