SPARQL查询在Fuseki中工作,但在Jena TDB中不工作

SPARQL查询在Fuseki中工作,但在Jena TDB中不工作,sparql,jena,fuseki,tdb,named-graphs,Sparql,Jena,Fuseki,Tdb,Named Graphs,我将数据组织在多个图表中。保存三元组的图形很重要。数据结构很复杂,但可以简化如下: 我的商店包含蛋糕,其中有不同蛋糕类型的层次结构, 0结果 SELECT * WHERE { GRAPH ?g { ?s ?p ?o }} SELECT * FROM <http://example.com/homemade> WHERE { ?s ?p ?o } SELECT * FROM NAMED <http://example.com/homemade> WHERE { GRAP

我将数据组织在多个图表中。保存三元组的图形很重要。数据结构很复杂,但可以简化如下:

我的商店包含蛋糕,其中有不同蛋糕类型的层次结构,

0结果

SELECT * WHERE { GRAPH ?g { ?s ?p ?o }}
SELECT * FROM <http://example.com/homemade> WHERE { ?s ?p ?o }
SELECT * FROM NAMED <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}
SELECT*从其中{s?p?o}
x结果

SELECT * FROM <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}
SELECT*从何处{GRAPH{s?p?o}
0结果

SELECT * WHERE { GRAPH ?g { ?s ?p ?o }}
SELECT * FROM <http://example.com/homemade> WHERE { ?s ?p ?o }
SELECT * FROM NAMED <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}
SELECT*从命名的WHERE{GRAPH{s?p?o}

0结果

确定,因此我的解决方案实际上与我执行查询的方式有关。我最初的想法是对数据集进行预过滤,以便只在相关的图上执行查询(数据集包含许多图,它们可能非常大,这会使查询“所有内容”的速度变慢)。这可以通过将它们添加到SPARQL或直接在Jena中实现(尽管这对其他三重存储不起作用)。然而,将这两种方式结合起来“出于安全考虑”是行不通的

SELECT * WHERE { GRAPH ?g { ?s ?p ?o }}
SELECT * FROM <http://example.com/homemade> WHERE { ?s ?p ?o }
SELECT * FROM NAMED <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}
此查询在整个数据集上运行,并按预期工作:

Query query = QueryFactory.create("SELECT * WHERE { GRAPH ?g { ?s ?p ?o } }", Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(query, dataset);
ResultSet result = qexec.execSelect();
同一查询只能在特定的图上执行,而不管是哪个图,它都不会给出任何结果:

//run only on one graph
Model target = dataset.getNamedModel("http://example.com/homemade");
//OR run on the union of all graphs
Model target = dataset.getNamedModel("urn:x-arq:UnionGraph");
//OR run on a union of specific graphs
Model target = ModelFactory.createUnion(dataset.getNamedModel("http://example.com/shopbought"), dataset.getNamedModel("http://example.com/homemade"), ...);
[...]
QueryExecution qexec = QueryExecutionFactory.create(query, target);
[...]
我的解决方法是现在总是查询整个数据集(它支持SPARQL GRAPH关键字fine),并且对于每个查询,总是指定它应该运行的图形,以避免必须查询整个数据集。
不确定这是否是Jena API的预期行为查看.Stanislav是否正确。对图形名称使用完整URI。否则,这些可能会解析为文件的默认位置等。我确实使用完整URI,我只是在示例中缩短了它,并使用括号表示它是完整URI。我相应地更新了我的示例,使其更加清晰。在将数据加载到相应的图形中时,也会使用完整的URI。。。