Запрос Sparql с выводом

у меня есть файлы rdf и rdfs, и я хочу использовать реализацию jena sparql для запроса, и мой код выглядит так:

 //model of my rdf file 
 Model model = ModelFactory.createMemModelMaker().createDefaultModel();
 model.read(inputStream1, null);
//model of my ontology (word net) file
 Model onto = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF);
 onto.read( inputStream2,null);
    String queryString =
                        "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                        + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> "
                        + "SELECT ?person "
                        + "WHERE {"
                        + "  ?person    rdf:type   wn:Person  . "
                        + "      }";

    Query query = QueryFactory.create(queryString);
    QueryExecution qe = QueryExecutionFactory.create(query, ????);
    ResultSet results = qe.execSelect();
    ResultSetFormatter.out(System.out, results, query);
    qe.close();

и у меня есть онтология wordNet в файле rdf, и я хочу использовать эту онтологию в своем запросе для автоматического вывода (когда я запрашиваю человека, запрос должен возвращать, например, мужчина, женщина), так как связать онтологию с моим запросом? пожалуйста, помогите мне.

обновление: теперь у меня есть две модели: из какой я должен запускать свой запрос?

 QueryExecution qe = QueryExecutionFactory.create(query, ????);

заранее спасибо.


person Radi    schedule 14.05.2011    source источник


Ответы (1)


Ключ в том, чтобы признать, что в Йене Model является одной из центральных абстракций. Модель логического вывода — это всего лишь Model, в котором присутствуют некоторые триплеты, потому что они вытекают из правил логического вывода, а не считываются из исходного документа. Таким образом, вам нужно изменить только первую строку вашего примера, где вы изначально создаете модель.

Хотя вы можете создавать модели логического вывода напрямую, зачастую проще просто создайте OntModel с необходимой степенью поддержки логического вывода:

Model model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF );

Если вам нужен другой аргумент или поддержка OWL, вы можете выбрать другую константу OntModelSpec. Имейте в виду, что большие и/или сложные модели могут замедлять выполнение запросов.

Обновление (после редактирования исходного вопроса)

Чтобы рассуждать над двумя моделями, вам нужен союз. Вы можете сделать это с помощью подмодели OntModel. Я бы изменил ваш пример следующим образом (примечание: я не тестировал этот код, но он должен работать):

String rdfFile = "... your RDF file location ...";
Model source = FileManager.get().loadModel( rdfFile );

String ontFile = "... your ontology file location ...";
Model ont = FileManager.get().loadModel( ontFile );

Model m = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF, ont );
m.addSubModel( source );

String queryString =
                    "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                    + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> "
                    + "SELECT ?person "
                    + "WHERE {"
                    + "  ?person    rdf:type   wn:Person  . "
                    + "      }";

Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, m);
ResultSet results = qe.execSelect();
ResultSetFormatter.out(System.out, results, query);
qe.close();
person Ian Dickinson    schedule 15.05.2011
comment
спасибо за вашу помощь, я использую эту модель для загрузки моего rdf, который я хочу запросить, но как загрузить файл онтологии (.rdf) и использовать его для вывода при выполнении запроса? - person Radi; 15.05.2011
comment
См. Javadocs для Model.read() или FileManager.readModel(). Лично я бы использовал маршрут FileManager. - person Ian Dickinson; 15.05.2011
comment
Если у вас есть второй запрос, связанный с вашим первым вопросом, вам действительно следует опубликовать новый вопрос в StackOverflow. SO на самом деле не дискуссионный форум, а способ сбора хороших вопросов и хороших ответов. Кстати, именно поэтому вы должны принимать ответы, которые удовлетворяют ваш вопрос — это помогает другим пользователям находить хорошие ответы. - person Ian Dickinson; 16.05.2011