我正在使用耶拿。我创建了一个界面,该界面允许在rdf文件中添加,修改和删除实例。我在执行代码时收到此警告:WARN [main](RDFDefaultErrorHandler.java:36)-未知源:{W136} RDF中不允许使用相对URI:特别是谁知道我该如何解决?这是我的代码:import java.util.*;import java.util.List;import com.hp.hpl.jena.rdf.model.*;import com.hp.hpl.jena.ontology.*;import com.hp.hpl.jena.ontology.impl.*;import com.hp.hpl.jena.util.*;import java.io.*;import java.awt.*;import java.awt.event.*;import com.hp.hpl.jena.vocabulary.RDF;import com.hp.hpl.jena.vocabulary.XSD;import com.hp.hpl.jena.util.iterator.ExtendedIterator;public class FamilyModel extends Frame{TextField[]tabTF=new TextField[4];Button bAjout, bModifier, bSupprimer, bPrecedent, bSuivant, bValiderModif; //buttons Add, Remove, Previous, NextOntModel model;Onto onto;int indice=0;int p=0;Resource p1;Button creerBouton(String S, int x, int y){ Button b=new Button(S); add(b); b.setBounds(x,y,120,30); return b;}void creerLabel(String etiquette, int x, int y){ Label la=new Label(etiquette); la.setBounds(x,y,100,25); add(la);}public FamilyModel (){ setLayout (null); setBackground (Color.pink); setBounds (100,200,900,450); creerLabel("Prenom : ",10,50); creerLabel("Nom : ",10,100); creerLabel("Date de Naissance: ",10,145); creerLabel("Genre (H ou F): ",10,190); //TextFields for(int i=0;i<4;i++) { tabTF[i]=new TextField(""); tabTF[i].setBackground(Color.white); add(tabTF[i]); } tabTF[0].setBounds(120,45,150,25); tabTF[1].setBounds(120,100,150,25); tabTF[2].setBounds(120,145, 100,25); tabTF[3].setBounds(120,190, 45,25); bAjout=creerBouton("Ajouter",20,250); setVisible(true); bModifier=creerBouton("Modifier",138,250); setVisible(true); //bSupprimer=creerBouton("Supprimer",250,250); //setVisible(true); bPrecedent=creerBouton("Precedent",360,250); bSuivant=creerBouton("Suivant",450,250); bSupprimer=creerBouton("Supprimer",600,250); setVisible(true); onto = new Onto(); readRDFfile(); traitement(this);}void traitement(Frame fenetre){ bAjout.addActionListener(new ActionAjoutPersonne()); //bModifier.addActionListener(new ActionModifier()); //bValiderModif.addActionListener(new ActionModif()); bSuivant.addActionListener(new ActionSuivant()); bPrecedent.addActionListener(new ActionPrecedent()); bSupprimer.addActionListener(new ActionSupprimer());}//Button Addpublic class ActionAjoutPersonne implements ActionListener{ public void actionPerformed(ActionEvent evt) { p1=onto.model.createResource(onto.uriBase+"#"+tabTF[0].getText()); p1.addProperty(onto.aPourPrenom, tabTF[0].getText()); p1.addProperty(onto.aPourNom, tabTF[1].getText()); p1.addProperty(onto.aDateNaiss, tabTF[2].getText()); if (tabTF[3].getText().equals("F")) { p1.addProperty(onto.aGenre, tabTF[3].getText()); p1.addProperty(RDF.type, onto.femme); } else if (tabTF[3].getText().equals("H")) { p1.addProperty(onto.aGenre, tabTF[3].getText()); p1.addProperty(RDF.type, onto.homme); } StringWriter sw = new StringWriter(); onto.model.write(sw, "RDF/XML-ABBREV"); String owlCode = sw.toString(); File file = new File("d:/Onto.rdf"); try{ FileWriter fw = new FileWriter(file); fw.write(owlCode); fw.close(); } catch(FileNotFoundException fnfe){ fnfe.printStackTrace();} catch(IOException ioe){ ioe.printStackTrace(); } }}//Button Removepublic class ActionSupprimer implements ActionListener{ public void actionPerformed(ActionEvent evt) { List<Statement> statementsToRemove = new ArrayList<Statement>(); StmtIterator iter = onto.model.listStatements(); while (iter.hasNext()) { Statement stmt = iter.nextStatement(); Resource subject = stmt.getSubject(); Property predicate = stmt.getPredicate(); RDFNode object = stmt.getObject(); if(subject.toString().equals (onto.uriBase+"#"+tabTF[0].getText())) { statementsToRemove.add(stmt); } } for( Statement stmt : statementsToRemove) { onto.model.remove(stmt); } StringWriter sw = new StringWriter(); onto.model.write(sw, "RDF/XML-ABBREV"); String owlCode = sw.toString(); File file = new File("d:/Onto.rdf"); try{ FileWriter fw = new FileWriter(file); fw.write(owlCode); fw.close(); } catch(FileNotFoundException fnfe){ fnfe.printStackTrace();} catch(IOException ioe){ ioe.printStackTrace(); } }}//Read Onto.rdfpublic void readRDFfile(){ String inputFile="D:/Onto.rdf"; try { InputStream in =new FileInputStream(inputFile); if (in == null) { System.out.println("File not found"); } onto.model.read(in," "); }catch(Exception e) { System.out.println("model.read catched error: " + e); }}//Button Nextclass ActionSuivant implements ActionListener{ public void actionPerformed(ActionEvent evt) { ++indice; ExtendedIterator instances = onto.personne.listInstances(); Individual instance = null; Individual firstInstance = null; for (p = 0; p < indice && instances.hasNext(); p++) { instance = (Individual) instances.next(); if (firstInstance == null) { firstInstance = instance; } } if (p < indice) { indice = 1; instance = firstInstance; } tabTF[0].setText(instance.getPropertyValue(onto.aPourPrenom).toString()); tabTF[1].setText(instance.getPropertyValue(onto.aPourNom).toString()); tabTF[2].setText(instance.getPropertyValue(onto.aDateNaiss).toString()); tabTF[3].setText(instance.getPropertyValue(onto.aGenre).toString()); }}class ActionPrecedent implements ActionListener{ public void actionPerformed(ActionEvent evt) { --indice; //Instances de la Classe Personne ExtendedIterator instances=onto.personne.listInstances(); Individual instance = null; for(p = 0; p < indice && instances.hasNext(); p++) { instance = (Individual) instances.next(); } tabTF[0].setText(instance.getPropertyValue(onto.aPourPrenom).toString()); tabTF[1].setText(instance.getPropertyValue(onto.aPourNom).toString()); tabTF[2].setText(instance.getPropertyValue(onto.aDateNaiss).toString()); tabTF[3].setText(instance.getPropertyValue(onto.aGenre).toString()); }}//Ontologypublic class Onto{ OntClass personne, genre, homme, femme, feminin, masculin, evenement, deces, mariage, divorce; OntModel model; String uriBase; ObjectProperty aPourFils, aPourFille, aGenre; DatatypeProperty aPourNom, aPourPrenom, aDateNaiss; public Onto (){ model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF ); uriBase = "http://www.something.com/FAM"; model.createOntology(uriBase); //Classes personne = model.createClass(uriBase+"personne"); femme = model.createClass(uriBase+"femme"); homme = model.createClass(uriBase+"homme"); genre = model.createClass(uriBase+"genre"); feminin = model.createClass(uriBase+"feminin"); masculin = model.createClass(uriBase+"masculin"); evenement = model.createClass(uriBase+"evenement"); deces = model.createClass(uriBase+"deces"); mariage = model.createClass(uriBase+"mariage"); divorce = model.createClass(uriBase+"divorce"); //Sub-classes genre.addSubClass(feminin); genre.addSubClass(masculin); personne.addSubClass(homme); personne.addSubClass(femme); evenement.addSubClass(deces); evenement.addSubClass(mariage); evenement.addSubClass(divorce); aPourFils = model.createObjectProperty(uriBase+"aPourFils"); aPourFils.setDomain(personne); aPourFils.setRange(homme); aPourFille = model.createObjectProperty(uriBase+"aPourFille"); aPourFille.setDomain(personne); aPourFille.setRange(femme); aGenre = model.createObjectProperty(uriBase+"aGenre"); aGenre.setDomain(personne); aGenre.setRange(genre); aPourNom = model.createDatatypeProperty(uriBase+"aPourNom"); aPourNom.setDomain(personne); aPourNom.setRange(XSD.xstring); aPourPrenom = model.createDatatypeProperty(uriBase+"aPourPrenom"); aPourPrenom.setDomain(personne); aPourPrenom.setRange(XSD.xstring); aDateNaiss = model.createDatatypeProperty(uriBase+"aDateNaiss"); aDateNaiss.setDomain(personne); aDateNaiss.setRange(XSD.xstring); }}public static void main(String args[]){ new FamilyModel();}} (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 问题是public void readRDFFile()的以下行: onto.model.read(in," ");您正在传递" "的基本URI。由于没有方案指示符(例如http:,file:等),因此将其解释为相对URI,而基本URI则不允许这样做。我认为您实际上是在说您没有基本URI,在这种情况下,您应该传递null: onto.model.read(in,null);顺便说一句,我注意到在该行之前的前一个if语句检查输入流in是否为空。但是,它将打印警告并继续使用in,这将为您提供NullPointerException。 (adsbygoogle = window.adsbygoogle || []).push({}); 10-05 22:08