Java SPARQL查询不会从特定RDF图返回任何内容
在python中使用RDFLib创建RDF图以应用传感器本体后(我使用传感器本体,也使用名称空间和Bnode,这是一个空白节点,表示未提供URI或文本的资源)。我尝试使用sparql在java中查询数据,因此我必须先使用Jena TDB存储图形,然后执行一个非常简单的查询,即:Java SPARQL查询不会从特定RDF图返回任何内容,java,sparql,jena,rdflib,tdb,Java,Sparql,Jena,Rdflib,Tdb,在python中使用RDFLib创建RDF图以应用传感器本体后(我使用传感器本体,也使用名称空间和Bnode,这是一个空白节点,表示未提供URI或文本的资源)。我尝试使用sparql在java中查询数据,因此我必须先使用Jena TDB存储图形,然后执行一个非常简单的查询,即: String qs1 = "SELECT * {?s ?p ?o} LIMIT 10" ; 我曾经 String source = "/path/graph.rdf"; FileManager.get(
String qs1 = "SELECT * {?s ?p ?o} LIMIT 10" ;
我曾经
String source = "/path/graph.rdf";
FileManager.get().readModel( tdb, source);
dataset.begin(ReadWrite.READ) ;
String qs1 = "SELECT * {?s ?o ?p } " ;
try(QueryExecution qExec = QueryExecutionFactory.create(qs1, dataset)) {
ResultSet rs = qExec.execSelect() ;
ResultSetFormatter.outputAsJSON(rs) ;
}`
执行查询并观察json格式的数据。
我面临的问题是它什么也不返回!
这是输出:
{
"head": {
"vars": [ "s" , "o" , "p" ]
} ,
"results": {
"bindings": [
]
}
}
我编写了一个简单的代码来验证是否存储了数据:
StmtIterator iter = tdb.listStatements();
// print out the predicate, subject and object of each statement
while (iter.hasNext()) {
Statement stmt = iter.nextStatement(); // get next statement
Resource subject = stmt.getSubject(); // get the subject
Property predicate = stmt.getPredicate(); // get the predicate
RDFNode object = stmt.getObject(); // get the object
System.out.print(subject.toString());
System.out.print(" " + predicate.toString() + " ");
if (object instanceof Resource) {
System.out.print(object.toString());
} else {
// object is a literal
System.out.print(" \"" + object.toString() + "\"");
}
System.out.println(" .");
}
事实上,它们存储在TDB数据库中。这是一些输出,其中包括一个奇怪的Bnode表示,根据一些文章,它是TDB与Bnode反应的方式,这使它看起来像那样
6f98bd70:1543430b66e:-7fc3 http://www.loa-cnr.it/ontologies/DUL.owl#hasDataValue "37^^file:///data/rbe/workspace/openmtc-python/openmtc-gevent/xsd.float" .
-6f98bd70:1543430b66e:-7fc2 http://purl.oclc.org/NET/UNIS/fiware/iot-lite#hasunit http://purl.oclc.org/NET/ssnx/qu/unit#hPa .
-6f98bd70:1543430b66e:-7fc2 http://www.loa-cnr.it/ontologies/DUL.owl#hasDataValue "996.94^^file:///data/rbe/workspace/openmtc-python/openmtc-gevent/xsd.float" .
-6f98bd70:1543430b66e:-7fc1 http://purl.oclc.org/NET/UNIS/fiware/iot-lite#hasunit http://purl.oclc.org/NET/ssnx/qu/unit# .
-6f98bd70:1543430b66e:-7fc1 http://www.loa-cnr.it/ontologies/DUL.owl#hasDataValue "OK^^file:///data/rbe/workspace/openmtc-python/openmtc-gevent/xsd.float" .
-6f98bd70:1543430b66e:-7fc0 http://purl.oclc.org/NET/UNIS/fiware/iot-lite#hasunit http://purl.oclc.org/NET/ssnx/qu/unit#C .
-6f98bd70:1543430b66e:-7fc0 http://www.loa-cnr.it/ontologies/DUL.owl#hasDataValue "24.2^^file:///data/rbe/workspace/openmtc-python/openmtc-gevent/xsd.float" .
我还尝试了另一个使用friend of a friend本体的图形,它运行良好且正确。
是否有可能是Bnode导致了此问题?尝试:
SELECT*{{s?p?o}UNION{GRAPH?g{s?p?o}}}
您的注释表明数据位于命名图中,但您只要求查询未命名/默认图。建议的查询可以在数据集中的任何位置查找所有内容。尝试:
SELECT*{{s?p?o}UNION{GRAPH?g{s?p?o}}}
您的注释表明数据位于命名图中,但您只要求查询未命名/默认图。建议的查询可以在数据集中的任何位置查找所有内容。正如@AndyS mont所说,建议的查询工作正常。如果您不想使用union部分,只需按照Andy的建议添加所需图形的名称即可。应该是这样的:
QueryExecution qExec = QueryExecutionFactory.create(qs1, YourGraphNameHERE));
ResultSet rs = qExec.execSelect() ;
ResultSetFormatter.outputAsJSON(rs) ;
正如@AndyS所说,这个查询很好用。如果您不想使用union部分,只需按照Andy的建议添加所需图形的名称即可。应该是这样的:
QueryExecution qExec = QueryExecutionFactory.create(qs1, YourGraphNameHERE));
ResultSet rs = qExec.execSelect() ;
ResultSetFormatter.outputAsJSON(rs) ;
两个问题:(i)您确定查询是针对正确的图形执行的吗?(ii)您向我们展示了结果集的一种用法,
rs
,但在此之前您是否对其进行了任何处理?默认情况下,结果集只允许您访问一次结果。@Joshua我用使用结果集的代码编辑了我的问题。实际上,我在TDB中保存了两个不同的图形,一个是FOAF图形,另一个是我创建的图形,每次执行查询时,它都会从FOAF图形中返回数据,因此我将数据集目录更改为另一个路径,以便它只存储一个图形。我前面没有文档,但我认为FileManager.get().readModel(tdb,source);
将内容读入一个模型tdb
,然后您使用dataset
进行查询。tdb
实际上是dataset
中的一个模型吗?我在执行查询之前使用了它:model tdb=dataset.getNamedModel(“我在这里使用了一个随机名称”)
我在不同的图形中使用了相同的代码,我得到了结果,可能是因为我在RDFLib中创建图形的方式?两个问题:(i)您确定查询是针对正确的图形执行的吗?(ii)您向我们展示了结果集的一种用法,rs
,但在此之前您对它做了什么吗?默认情况下,结果集只允许您访问一次结果。@Joshua我用使用结果集的代码编辑了我的问题。我实际上在TDB中保存了两个不同的图形,一个是FOAF,另一个是我创建的,每次执行ute查询它从FOAF图形中获取数据,因此我将数据集目录更改为另一个路径,以便它只存储一个图形。我前面没有文档,但我认为FileManager.get().readModel(tdb,源代码)
将内容读入一个模型tdb
,然后使用dataset
进行查询。tdb
实际上是dataset
中的一个模型吗?我在执行查询之前使用了它:model tdb=dataset.getNamedModel(“我在这里使用了一个随机名称”)
我在不同的图形中使用了相同的代码,我得到了结果,这可能是由于我在RDFLib中创建图形的方式造成的?是否有任何方法可以指定图形,而不必使用联合部分?一旦知道图形的位置,就可以使用:图形{…模式…}
。但请注意,这是一个合法的完整URI,而不是一些短名称(短名称在解析时得到解析,成为完整URI)。是否有任何方法可以以不必使用联合部分的方式指定图形?一旦知道图形的位置,就可以使用:图形{…模式…}
。但请注意,这是一个合法的完整URI,而不是一些短名称(短名称在解析时得到解析,成为完整URI)。