Sparql Query With Inferencing - PullRequest
       8

Sparql Query With Inferencing

4 голосов
/ 14 мая 2011

У меня есть несколько файлов 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, ????);

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

1 Ответ

6 голосов
/ 15 мая 2011

Ключ в том, чтобы признать, что в Йене 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();
...