-1

rdf モデルのメールを apche tdb に保存しようとしています。これが私のコードです:

/*Program to download the mails from mail servers and then to store
  them in tdb store using rdf model*/
//import all the classes needed  




import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.Flags.Flag;
import javax.mail.internet.*;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPMessage;
import static com.hp.hpl.jena.query.ReadWrite.READ ;
import static com.hp.hpl.jena.query.ReadWrite.WRITE ;
import com.hp.hpl.jena.query.ReadWrite ;
import com.hp.hpl.jena.query.Dataset ;
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.QuerySolution ;
import com.hp.hpl.jena.query.ResultSet ;
import com.hp.hpl.jena.tdb.TDBFactory ;
import email.*; // import this to add properties as entities of email
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;


public class test2 {


public static void main(String[] args) throws MessagingException, IOException {
    IMAPFolder folder = null;
    Store store = null;
    String subjec = null;
    Flag flag = null;
    //String too;
    //Directory where the tdb files will be stored
     String directory = "MYDATABASES/DATA2" ;
     //create the dataset for the tdb store
    Dataset ds = TDBFactory.createDataset(directory) ;
    //create default rdf model
    Model model = ds.getDefaultModel() ;
    //write to the tdb dataset
    ds.begin(ReadWrite.WRITE);
    try 
    { //connecting to the server to download the emails
      Properties props = System.getProperties();
      props.setProperty("mail.store.protocol", "imaps");

      Session session = Session.getDefaultInstance(props, null);

      store = session.getStore("imaps");
      store.connect("imap.gmail.com","hjcooljohny75@gmail.com", "ferry@786");

      //folder = (IMAPFolder) store.getFolder("[Gmail]/Spam"); // This doesn't work for enter code here`other email account
      //to select the paticular types of mails
      folder = (IMAPFolder) store.getFolder("inbox");// This works for both email account


      if(!folder.isOpen())
      folder.open(Folder.READ_WRITE);
      Message[] messages = folder.getMessages();
      System.out.println("No of Messages : " + folder.getMessageCount());
      System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount());
      System.out.println(messages.length);
      //Displaying the info. of the messages
       for (int i=messages.length-1; i > messages.length-10;i--) 
      {

        System.out.println("*****************************************************************************");
        System.out.println("MESSAGE " + (i + 1) + ":");
        MimeMessage msg = (MimeMessage) messages[i];
        //creating rdf model of the message
        //too=toString(msg.getAllRecipients()[0]);
         Resource mail= model.createResource(msg.getMessageID())
        .addProperty(EMAILRDF.SUBJECT, msg.getSubject())  
        .addProperty(EMAILRDF.TO,msg.getAllRecipients()[0])
        .addLiteral(EMAILRDF.FROM,msg.getFrom()[0])
        .addLiteral(EMAILRDF.ENCODING,msg.getEncoding())
        .addLiteral(EMAILRDF.CONTENT,msg.getContent())
        .addLiteral(EMAILRDF.DATE,msg.getReceivedDate())
        .addLiteral(EMAILRDF.CONTENT_TYPE,msg.getContentType());

    // list the statements in the graph
    StmtIterator iter = model.listStatements();

    // print out the predicate, subject and object of each statement
    while (iter.hasNext()) {
        Statement stmt      = iter.nextStatement();         // get next statement
        Resource  subject   = stmt.getSubject();   // get the subject
        Property  predicate = stmt.getPredicate(); // get the predicate
        RDFNode   object    = stmt.getObject();    // get the object

        System.out.print(subject.toString());
        System.out.print(" "+ predicate.toString() + " ");
        if (object instanceof Resource) {
            System.out.print(object.toString());
        } else {
            // object is a literal
            System.out.print(" \"" + object.toString() + "\"");
        }
        System.out.println(" .");
    }
        //System.out.println(msg.getMessageNumber());
        //Object String;
        //System.out.println(folder.getUID(msg)

        //subject = msg.getSubject();

        //System.out.println("Subject: " + subject);
        //System.out.println("From: " + msg.getFrom()[0]);
        //System.out.println("To: "+msg.getAllRecipients()[0]);
        //System.out.println("Date: "+msg.getReceivedDate());
        //System.out.println("Size: "+msg.getSize());
        //System.out.println("Id: "+msg.getMessageID());
        //System.out.println(msg.getFlags());
        //System.out.println("Body: \n"+ msg.getContent());
        //System.out.println(msg.getContentType());

      }
    }
    finally 
    {  //closing the connection
      if (folder != null && folder.isOpen()) { folder.close(true); }
      if (store != null) { store.close(); }
    }


 //closing the dataset
ds.commit();
ds.end();
}
}

しかし、これにより addLteral() メソッドでエラーが発生します。 AddProperty() を使用してみましたが、それもエラーになります。

error: WARN [main] (LiteralLabelImpl.java:141) - inventing a datatype for class com.sun.mail.imap.protocol.IMAPAddress
Exception in thread "main" java.lang.NullPointerException
    at com.hp.hpl.jena.datatypes.TypeMapper.getTypeByValue(TypeMapper.java:156)
    at com.hp.hpl.jena.graph.impl.LiteralLabelImpl.<init>(LiteralLabelImpl.java:131)
    at com.hp.hpl.jena.graph.impl.LiteralLabelFactory.create(LiteralLabelFactory.java:77)
    at com.hp.hpl.jena.rdf.model.impl.ModelCom.createTypedLiteral(ModelCom.java:781)
    at com.hp.hpl.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:263)
    at test2.main(test2.java:80)

addproperty()またはaddLiteral()関数に入力しているクラスのデータ型が原因である可能性があると思います。
何か案が???

4

1 に答える 1

1

これはおそらく JavaDoc によって十分に回答されています。 Resourceは多数のaddLiteralメソッドを定義します。各メソッドはプロパティと、boolean、char、double、float、Literal、long、または Object 型の 2 番目の引数を取ります。警告に基づいて、「WARN [main] (LiteralLabelImpl.java:141) - inventing a datatype for

class com.sun.mail.imap.protocol.IMAPAddress" のように見えますが、addLiteral(Property,Object) メソッドを使用しているようです。

あなたがそれをするとき、JavaDocが言うように、あなたはしようとしています

typed-literal 値 o を持つプロパティ p をこのリソースに追加します。つまり、(this, p, typed(o)) を this のモデルに追加します。… 型付きリテラルは、this.getModel().createTypedLiteral(o) を使用して構築されたものと同じです。

スタックトレースから、createTypedLiteral が呼び出されていることがわかります。com.sun.mail.imap.protocol.IMAPAddress にデータ型が定義されていないことは驚くべきことではありません。addLiteral のどちらの呼び出しでも、2 番目の引数として IMAPAddress が含まれている場合は、型付きリテラルに変換できる 2 番目の引数を持つ呼び出しに置き換える必要があります。これを行う最も簡単な方法は、おそらくその toString() メソッドを使用することです。

于 2014-05-21T13:36:00.663 に答える