我正在尝试将Turtle文件加载到Android Studio中,并使用Androjena库对Turtle文件运行查询。我可以在带有JavaFX的Eclipse中完成此任务。但是,在Intellij IDE中,我遇到了致命错误,这显然使我的应用程序崩溃。我有一个名为runQuery()的方法,为了在文件上运行查询而调用该方法:
public String runQuery(){
String stringQuery = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> \n" +
"PREFIX dbo: <http://dbpedia.org/ontology/> \n" +
"SELECT ?birthDate WHERE { \n" +
"?barack foaf:name \"Barack Obama\"@en .\n" +
"?barack dbo:birthDate ?birthDate \n" +
"}";
String answer = "";
Model model = FileManager.get().loadModel("sample_pres.ttl", "TTL");
Query query = QueryFactory.create(stringQuery);
try {
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
while(results.hasNext()) {
QuerySolution soln = results.nextSolution();
Literal answerLiteral = soln.getLiteral("birthDate");
answer = answerLiteral.toString();
}
}
catch(Exception ignore) {
}
this.answer = answer;
return answer;
}
给我问题的代码行是FileManager.get()。loadModel()行。这是我得到的异常:
com.hp.hpl.jena.shared.NotFoundException: Not found: sample_pres.ttl
因此,尽管该文件位于我的Assets文件夹中,但我正在收集Android找不到该文件的信息。我假设我不/不能使用AssetManager,因为我没有尝试包含FileInputStream。因此,我在这一点上仍然很困。这是我的项目结构的图片:
我在项目结构中的app / src / main下添加了Assets文件夹。我对Android Studio相对较新,我知道在eclipse中的JavaFX中,我可以简单地使用File的绝对路径来访问它,而且我知道这显然在Android Studio中不起作用。但是,我找不到一个从Android项目(我的资产文件夹)中的本地源加载Turtle文件并执行查询的示例。该站点上的每个示例或问题似乎都与通过Internet连接从外部端点运行查询有关。所以这就是为什么我感到困惑的部分原因。我不确定如何从Android Studio中的本地源运行查询,并从我的资产文件夹引用Turtle文件,以避免com.hp.hpl.jena.shared.NotFoundException
答案 0 :(得分:1)
我找到了答案。问题是android studio中的资产文件无法在android studio中读取。即使使用.ttl文件并在turtle中读取它们,也必须将它们转换为FileOutputStream。这是代码示例:
String filePath = context.getFilesDir() + File.separator + "my_turtle.ttl";
File destinationFile = new File(filePath);
FileOutputStream outputStream = new FileOutputStream(destinationFile);
AssetManager assetManager = context.getAssets();
InputStream inputStream = assetManager.open("sample_3.ttl");
byte[] buffer = new byte[1024];
int length = 0;
while((length = inputStream.read(buffer)) != -1){
outputStream.write(buffer,0,length);
}
inputStream.close();
outputStream.close();
Model model = null;
model = FileManager.get().loadModel(filePath,"TTL");
Query query = QueryFactory.create(stringQuery);
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
while(results.hasNext()) {
QuerySolution soln = results.nextSolution();
Literal answerLiteral = soln.getLiteral("abstract");
answer = answerLiteral.toString();
System.out.println(answer);
}
if(!answer.equals("")){
this.answer = answer;
return answer;
}
else{
return "I could not find an answer";
}
答案 1 :(得分:1)
您可以通过仅使用InputStream
提供的AssetManager.open()
并将其传递给更新的RDFParser
API来简化代码,例如
InputStream inputStream = AssetManager.open("sample_3.ttl");
Model model = ModelFactory.createDefaultModel();
RDFParser.create().source(inputStream).lang(Lang.TTL).parse(model);
这避免了不必要地读入和写出文件。
但是它确实需要使用jena-arq
库以及最新版本的Jena(您似乎使用的是Jena 2的某些变体,您需要使用Jena 3.7或更高版本才能工作)< / p>