Ошибка загрузки файла черепахи в Android Studio - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь загрузить файл Turtle в Android studio и использовать библиотеку Androjena для выполнения запросов к файлу Turtle.Я могу сделать это в Eclipse с JavaFX без проблем.Тем не менее, в 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

Итак, я понял, что Android не находит файл, хотя файл находится в моей папке «Активы».Я предполагаю, что я не / не могу использовать AssetManager, так как я не пытаюсь включить FileInputStream.Так что я довольно застрял на этом этапе.Вот изображение моей структуры проекта:

enter image description here

Я добавил папку активов в app / src / main в моей структуре проекта.Я относительно новичок в Android Studio и знаю, что в JavaFX из eclipse я мог бы просто использовать абсолютный путь к файлу для доступа к нему, и я знаю, что это, очевидно, не будет работать в Android Studio.Однако я не смог найти ни одного примера загрузки файла Turtle из локального источника в проекте Android (папка с активами) и выполнения запроса.Кажется, что каждый пример или вопрос на этом сайте касается выполнения запроса от внешней конечной точки через интернет-соединение.Так что это частично, почему я запутался.Я не уверен, как выполнить запрос из локального источника в Android-студии и ссылаться на файл Turtle из папки моих ресурсов, чтобы избежать com.hp.hpl.jena.shared.NotFoundException

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете упростить свой код, просто взяв 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 или более поздняя версия, чтобы вышеприведенноеработа)

0 голосов
/ 15 октября 2018

Я нашел ответ.Проблема в том, что файлы активов в 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";
    }
...