当信息在不同的 ModelRDB 中时,如何 运行 一个 sparql?

How to run a sparql when information are in different ModelRDB?

我在 DBPedia 工作。我想要 运行 一些 sparql。所以我从这里下载了文件:http://wiki.dbpedia.org/services-resources/ontology.

如您所见,DBpedia 将其三元组分离到不同的文件中。 rdf:type 属性 的一个文件和 其他属性 .

的另一个文件

我将每个文件导入MySQL(持久化一个模型);考虑到我按顺序命名模型 "A" 和 "B"!代码如下:

for DBpedia Ontology RDF 类型语句

 private Model AModel;
 private Model BModel;

 DBConnection connection = new DBConnection(DB_URL, DB_USER, DB_PASSWORD, DB_TYPE);
 AModel = maker.createModel("A",true);
 model.begin();
 InputStream in =this.getClass().getClassLoader().getResourceAsStream("some address /instance_types_en.nt);
 model.read(in,null);// Commit the database transactionmodel.commit();

------------

再次为 DBpedia Ontology 其他 A-Box 属性

DBConnection connection = new DBConnection(DB_URL, DB_USER, DB_PASSWORD, DB_TYPE);
BModel = maker.createModel("B",true);
model.begin();
InputStream in =this.getClass().getClassLoader().getResourceAsStream("some address /mappingbased_properties_en.nt);
model.read(in,null);// Commit the database transactionmodel.commit();

所以到这里为止,我们有两个模型,用于 DBpedia Ontology RDF 类型语句DBpedia 的另一个 Ontology 其他 A-Box 属性.

问题是我们有一个需要这两个信息的 sparql。 (rdf:type 属性和非 rdf:type 属性);如:

林肯总统的妻子是谁?

它的等价sparql是:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX onto: <http://dbpedia.org/ontology/>
SELECT ?uri ?string
WHERE 
{
    ?person rdf:type onto:President .
    ?person foaf:surname "Lincoln"@en .
    ?person onto:spouse ?uri.
        OPTIONAL {?uri rdfs:label ?string .}
        FILTER (lang(?string) = "en") 
}

所以我应该 运行 在模型中使用这个 sparql。但是 jena 只让我在一个模型中执行 sparql:

所以我必须 运行 它喜欢:

QueryExecution qe1 = QueryExecutionFactory.create(query, AModel));

QueryExecution qe1 = QueryExecutionFactory.create(query, BModel));

**

?person onto:spouse ?uri. is in AModel and ?person rdf:type onto:Presiden is in BModel!

所以这个查询return没有记录!

那么解决方法是什么。我的程序生成了正确的 sparql,但我没有适当的数据集来 return 响应! 因为我有不同的模型,所以我不能在这里使用 Union operator!!

有几种方法:

  1. 将所有数据读入同一个模型
  2. 使用联合模型(ModelFactory.createUnion 或 MultiUnion)。
  3. 将模型分别读入 RDF 数据集(RDB 不可能)。
  4. 创建一个分别包含两个模型的数据集。

如果您使用的是具有 DBConnection 的 Jena 版本,其中一些可能无法工作,因为代码太旧了。