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

Error loading Turtle File in Android Studio

我正在尝试将 Turtle 文件加载到 Android studio 中并使用 Androjena 库 运行 查询 Turtle 文件。我可以在 Eclipse 中使用 JavaFX 毫无问题地做到这一点。但是,在 Intellij IDE 中,我收到了一个致命错误,这显然使我的应用程序崩溃了。我有一个名为 运行Query() 的方法,调用它是为了 运行 对文件的查询:

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 没有找到该文件,尽管该文件在我的资产文件夹中。我假设我没有't/cannot 使用 AssetManager,因为我没有尝试包含 FileInputStream。所以我在这一点上相当困难。这是我的项目结构的图片:

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

我找到了答案。问题是 android studio 中的资产文件无法在 android studio 中读取。它们必须转换为 FileOutputStream,即使在处理 .ttl 文件并在 turtle 中读取它们时也是如此。这是代码示例:

 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";
    }

您可以简化代码,只需采用 AssetManager.open() 提供的 InputStream 并将其传递给较新的 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 或更高版本才能使上述工作正常进行)