从耶拿的模型中检索项目
Retrieve items from a model in jena
我正在 运行 查询并将结果保存到 JSON 文件中。我正在加载 json 文件作为模型并尝试检索主语、宾语和谓语的列表。但是我收到以下错误:
Exception in thread "main" org.apache.jena.riot.RiotException: [line:
2, col: 3 ] Relative IRI: head at
org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.error(ErrorHandlerFactory.java:128)
at
org.apache.jena.riot.checker.CheckerIRI.iriViolations(CheckerIRI.java:138)
at
org.apache.jena.riot.checker.CheckerIRI.iriViolations(CheckerIRI.java:100)
at
org.apache.jena.riot.system.ParserProfileChecker.makeIRI(ParserProfileChecker.java:66)
at
org.apache.jena.riot.system.ParserProfileChecker.resolveIRI(ParserProfileChecker.java:59)
at
org.apache.jena.riot.system.ParserProfileChecker.createURI(ParserProfileChecker.java:112)
at
org.apache.jena.riot.lang.LangRDFJSON.tryParseTriples(LangRDFJSON.java:121)
at
org.apache.jena.riot.lang.LangRDFJSON.tryParseGraph(LangRDFJSON.java:68)
at
org.apache.jena.riot.lang.LangRDFJSON.runParser(LangRDFJSON.java:56)
at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42) at
org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:176)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861) at
org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667) at
org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:212) at
org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:145) at
org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:134) at
org.apache.jena.riot.adapters.AdapterFileManager.readModelWorker(AdapterFileManager.java:282)
at
org.apache.jena.util.FileManager.loadModelWorker(FileManager.java:305)
at org.apache.jena.util.FileManager.loadModel(FileManager.java:292)
at Main.main(Main.java:51)
我的代码是:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.util.FileManager;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" + "PREFIX dc: <http://purl.org/dc/elements/1.1/>"
+ "PREFIX dbr: <http://dbpedia.org/resource/>" + "PREFIX dbpedia2: <http://dbpedia.org/property/>"
+ "PREFIX dbpedia: <http://dbpedia.org/>" + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"
+ "PREFIX dbo: <http://dbpedia.org/ontology/>" + "select distinct ?p ?o where {"
+ "dbr:Cristiano_Ronaldo ?p ?o " + "filter(langMatches(lang(?o),'en'))" +
"}";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
ResultSet results = qexec.execSelect();
FileOutputStream oFile;
try {
oFile = new FileOutputStream("output4.json", false);
ResultSetFormatter.outputAsJSON(oFile, results);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
qexec.close();
FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model = FileManager.get().loadModel("output4.json", null, "RDF/JSON");
StmtIterator iter = model.listStatements();
try {
while (iter.hasNext()) {
Statement stmt = iter.next();
Resource s = stmt.getSubject();
Resource p = stmt.getPredicate();
RDFNode o = stmt.getObject();
System.out.println(s.toString());
System.out.println(p.toString());
System.out.println(o.toString());
}
} finally {
if (iter != null)
iter.close();
}
}
}
根据 AKSW 的建议,我已经尝试使用构造查询:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.query.ResultSetRewindable;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.util.FileManager;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" + "PREFIX dc: <http://purl.org/dc/elements/1.1/>"
+ "PREFIX dbr: <http://dbpedia.org/resource/>" + "PREFIX dbpedia2: <http://dbpedia.org/property/>"
+ "PREFIX dbpedia: <http://dbpedia.org/>" + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"
+ "PREFIX dbo: <http://dbpedia.org/ontology/>" + "select distinct ?p ?o where {"
+ "dbr:Cristiano_Ronaldo ?p ?o " + "filter(langMatches(lang(?o),'en'))" +
"}";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
FileOutputStream oFile;
try {
oFile = new FileOutputStream("output4.ttl", false);
Model result21 = qexec.execConstruct();
result21.write(oFile, "TURTLE");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
qexec.close();
FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model = FileManager.get().loadModel("output4.ttl", null, "TURTLE");
StmtIterator iter = model.listStatements();
try {
while (iter.hasNext()) {
Statement stmt = iter.next();
Resource s = stmt.getSubject();
Resource p = stmt.getPredicate();
RDFNode o = stmt.getObject();
System.out.println(s.toString());
System.out.println(p.toString());
System.out.println(o.toString());
}
} finally {
if (iter != null)
iter.close();
}
}
}
打印结果很奇怪,没有正确提供主语、宾语和谓语。
以下是打印在控制台中的响应:
result
问题是您 运行 一个 SELECT 查询返回一个结果集。该结果集并不像您预期的那样表示 RDF 三元组。特别是因为你只有 select p
和 o
,因此,主题会丢失。然后将该结果集保存为 JSON,请参阅 https://www.w3.org/TR/rdf-sparql-json-res/ 了解格式说明。因此,JSON 文件中没有可以加载到 JENA 模型中的三元组。
解决方案是改用 SPARQL CONSTRUCT。查询可以如下:
PREFIX dbr: <http://dbpedia.org/resource/>
CONSTRUCT {
dbr:Cristiano_Ronaldo ?p ?o .
} WHERE {
dbr:Cristiano_Ronaldo ?p ?o .
FILTER(LANGMATCHES(LANG(?o),'en'))
}
此外,您必须调整 Jena 中的方法调用 API:
Model model = qexec.execConstruct(); // instead of execSelect();
我正在 运行 查询并将结果保存到 JSON 文件中。我正在加载 json 文件作为模型并尝试检索主语、宾语和谓语的列表。但是我收到以下错误:
Exception in thread "main" org.apache.jena.riot.RiotException: [line: 2, col: 3 ] Relative IRI: head at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.error(ErrorHandlerFactory.java:128) at org.apache.jena.riot.checker.CheckerIRI.iriViolations(CheckerIRI.java:138) at org.apache.jena.riot.checker.CheckerIRI.iriViolations(CheckerIRI.java:100) at org.apache.jena.riot.system.ParserProfileChecker.makeIRI(ParserProfileChecker.java:66) at org.apache.jena.riot.system.ParserProfileChecker.resolveIRI(ParserProfileChecker.java:59) at org.apache.jena.riot.system.ParserProfileChecker.createURI(ParserProfileChecker.java:112) at org.apache.jena.riot.lang.LangRDFJSON.tryParseTriples(LangRDFJSON.java:121) at org.apache.jena.riot.lang.LangRDFJSON.tryParseGraph(LangRDFJSON.java:68) at org.apache.jena.riot.lang.LangRDFJSON.runParser(LangRDFJSON.java:56) at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42) at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:176) at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861) at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667) at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:212) at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:145) at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:134) at org.apache.jena.riot.adapters.AdapterFileManager.readModelWorker(AdapterFileManager.java:282) at org.apache.jena.util.FileManager.loadModelWorker(FileManager.java:305) at org.apache.jena.util.FileManager.loadModel(FileManager.java:292) at Main.main(Main.java:51)
我的代码是:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.util.FileManager;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" + "PREFIX dc: <http://purl.org/dc/elements/1.1/>"
+ "PREFIX dbr: <http://dbpedia.org/resource/>" + "PREFIX dbpedia2: <http://dbpedia.org/property/>"
+ "PREFIX dbpedia: <http://dbpedia.org/>" + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"
+ "PREFIX dbo: <http://dbpedia.org/ontology/>" + "select distinct ?p ?o where {"
+ "dbr:Cristiano_Ronaldo ?p ?o " + "filter(langMatches(lang(?o),'en'))" +
"}";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
ResultSet results = qexec.execSelect();
FileOutputStream oFile;
try {
oFile = new FileOutputStream("output4.json", false);
ResultSetFormatter.outputAsJSON(oFile, results);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
qexec.close();
FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model = FileManager.get().loadModel("output4.json", null, "RDF/JSON");
StmtIterator iter = model.listStatements();
try {
while (iter.hasNext()) {
Statement stmt = iter.next();
Resource s = stmt.getSubject();
Resource p = stmt.getPredicate();
RDFNode o = stmt.getObject();
System.out.println(s.toString());
System.out.println(p.toString());
System.out.println(o.toString());
}
} finally {
if (iter != null)
iter.close();
}
}
}
根据 AKSW 的建议,我已经尝试使用构造查询:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.query.ResultSetRewindable;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.util.FileManager;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" + "PREFIX dc: <http://purl.org/dc/elements/1.1/>"
+ "PREFIX dbr: <http://dbpedia.org/resource/>" + "PREFIX dbpedia2: <http://dbpedia.org/property/>"
+ "PREFIX dbpedia: <http://dbpedia.org/>" + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"
+ "PREFIX dbo: <http://dbpedia.org/ontology/>" + "select distinct ?p ?o where {"
+ "dbr:Cristiano_Ronaldo ?p ?o " + "filter(langMatches(lang(?o),'en'))" +
"}";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
FileOutputStream oFile;
try {
oFile = new FileOutputStream("output4.ttl", false);
Model result21 = qexec.execConstruct();
result21.write(oFile, "TURTLE");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
qexec.close();
FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model = FileManager.get().loadModel("output4.ttl", null, "TURTLE");
StmtIterator iter = model.listStatements();
try {
while (iter.hasNext()) {
Statement stmt = iter.next();
Resource s = stmt.getSubject();
Resource p = stmt.getPredicate();
RDFNode o = stmt.getObject();
System.out.println(s.toString());
System.out.println(p.toString());
System.out.println(o.toString());
}
} finally {
if (iter != null)
iter.close();
}
}
}
打印结果很奇怪,没有正确提供主语、宾语和谓语。 以下是打印在控制台中的响应: result
问题是您 运行 一个 SELECT 查询返回一个结果集。该结果集并不像您预期的那样表示 RDF 三元组。特别是因为你只有 select p
和 o
,因此,主题会丢失。然后将该结果集保存为 JSON,请参阅 https://www.w3.org/TR/rdf-sparql-json-res/ 了解格式说明。因此,JSON 文件中没有可以加载到 JENA 模型中的三元组。
解决方案是改用 SPARQL CONSTRUCT。查询可以如下:
PREFIX dbr: <http://dbpedia.org/resource/>
CONSTRUCT {
dbr:Cristiano_Ronaldo ?p ?o .
} WHERE {
dbr:Cristiano_Ronaldo ?p ?o .
FILTER(LANGMATCHES(LANG(?o),'en'))
}
此外,您必须调整 Jena 中的方法调用 API:
Model model = qexec.execConstruct(); // instead of execSelect();