在 Android Studio 中加载 Turtle 文件时出错

我正在尝试将 Turtle 文件加载到 Android Studio 中,并使用 Androjena 库对 Turtle 文件运行查询。我可以在 Eclipse 中使用 JavaFX 毫无问题地执行此操作。但是,在 Intellij IDE 中,我收到了一个 FATAL 错误,这显然会导致我的应用程序崩溃。我有一个名为 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

所以我收集到 Android 没有找到该文件,尽管该文件在我的 Assets 文件夹中。我假设我不/不能使用 AssetManager,因为我没有尝试包含 FileInputStream。所以我在这一点上被困住了。这是我的项目结构的图片:

http://img3.mukewang.com/6194a6540001fc0603390364.jpg

我在我的项目结构中添加了 app/src/main 下的资产文件夹。我对 Android Studio 比较陌生,我知道在 Eclipse 的 JavaFX 中,我可以简单地使用文件的绝对路径来访问它,我知道这显然在 Android Studio 中不起作用。但是,我找不到从 Android 项目(我的资产文件夹)中的本地源加载 Turtle 文件并执行查询的示例。此站点上的每个示例或问题似乎都与通过 Internet 连接从外部端点运行查询有关。所以这就是我感到困惑的部分原因。我不确定如何从 Android Studio 中的本地源运行查询并从我的资产文件夹中引用 Turtle 文件以避免 com.hp.hpl.jena.shared.NotFoundException


回首忆惘然
浏览 139回答 2
2回答

Smart猫小萌

您可以通过仅获取InputStream提供者AssetManager.open()并将其传递给较新的RDFParserAPI来简化您的代码,例如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 或更高版本才能使上述内容正常工作)

慕容3067478

我找到了答案。问题是 android studio 中的资产文件无法在 android studio 中读取。它们必须转换为 FileOutputStream,即使在使用 .ttl 文件并在乌龟中读取它们时也是如此。这是代码的示例:&nbsp;String filePath = context.getFilesDir() + File.separator + "my_turtle.ttl";&nbsp; &nbsp; File destinationFile = new File(filePath);&nbsp; &nbsp; FileOutputStream outputStream = new FileOutputStream(destinationFile);&nbsp; &nbsp; AssetManager assetManager = context.getAssets();&nbsp; &nbsp; InputStream inputStream = assetManager.open("sample_3.ttl");&nbsp; &nbsp; byte[] buffer = new byte[1024];&nbsp; &nbsp; int length = 0;&nbsp; &nbsp; while((length = inputStream.read(buffer)) != -1){&nbsp; &nbsp; &nbsp; &nbsp; outputStream.write(buffer,0,length);&nbsp; &nbsp; }&nbsp; &nbsp; inputStream.close();&nbsp; &nbsp; outputStream.close();&nbsp; &nbsp; Model model = null;&nbsp; &nbsp; model = FileManager.get().loadModel(filePath,"TTL");&nbsp; &nbsp; Query query = QueryFactory.create(stringQuery);&nbsp; &nbsp; QueryExecution qexec = QueryExecutionFactory.create(query, model);&nbsp; &nbsp; ResultSet results = qexec.execSelect();&nbsp; &nbsp; while(results.hasNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QuerySolution soln = results.nextSolution();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Literal answerLiteral = soln.getLiteral("abstract");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = answerLiteral.toString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(answer);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; if(!answer.equals("")){&nbsp; &nbsp; &nbsp; &nbsp; this.answer = answer;&nbsp; &nbsp; &nbsp; &nbsp; return answer;&nbsp; &nbsp; }&nbsp; &nbsp; else{&nbsp; &nbsp; &nbsp; &nbsp; return "I could not find an answer";&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java