Java SPARQL查询不会从特定RDF图返回任何内容

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(

在python中使用RDFLib创建RDF图以应用传感器本体后(我使用传感器本体,也使用名称空间和Bnode,这是一个空白节点,表示未提供URI或文本的资源)。我尝试使用sparql在java中查询数据,因此我必须先使用Jena TDB存储图形,然后执行一个非常简单的查询,即:

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)。