当信息在不同的 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!!
有几种方法:
- 将所有数据读入同一个模型
- 使用联合模型(ModelFactory.createUnion 或 MultiUnion)。
- 将模型分别读入 RDF 数据集(RDB 不可能)。
- 创建一个分别包含两个模型的数据集。
如果您使用的是具有 DBConnection 的 Jena 版本,其中一些可能无法工作,因为代码太旧了。
我在 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!!
有几种方法:
- 将所有数据读入同一个模型
- 使用联合模型(ModelFactory.createUnion 或 MultiUnion)。
- 将模型分别读入 RDF 数据集(RDB 不可能)。
- 创建一个分别包含两个模型的数据集。
如果您使用的是具有 DBConnection 的 Jena 版本,其中一些可能无法工作,因为代码太旧了。