2016-04-20 23 views
0

在Python中创建使用RDFLib申请的传感器本体(I用于该传感器本体,用过也命名空间和B节点,其是表示用于其中的资源的空节点RDF图后没有给出URI或文字)。我试图查询中使用SPARQL Java中的数据因此我不得不存储第一使用Jena的TDB然后我执行一个非常简单的查询其是图:SPARQL查询返回从一个特定的RDF图没什么

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" . 

我也试过它采用了朋友本体的朋友另一个图形并能正常工作,正确。 Bnode是否有可能导致此问题?

+0

有两个问题:(i)您确定查询是针对正确的图执行的吗? (ii)您向我们展示了结果集“rs”的一个用法,但在此之前您是否在做任何事情? ResultSets默认情况下只允许您访问一次结果。 –

+0

@Joshua我用我使用ResultSet的代码编辑了我的问题。我居然在TDB一个与FOAF和我创建了一个挽救了两个不同的图形,每次我执行它让我回的数据从FOAF图的查询时间,因此我改变了数据集目录到其他路径,因此将只存储一个图形。 – raeX

+0

我不[T在我面前的文档,但我认为'FileManager.get()readModel(TDB,源);'读取内容到模型'tdb',但你使用'dataset'为您的查询。 'tdb'实际上是'dataset'中的模型吗? –

回答

2

尝试:SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

您的意见建议中的数据是在一个名为图形,但你问只是无名/默认的图形的查询。建议的查询会查找数据集中任何地方的所有内容。

+0

谢谢!它现在有效 – raeX

+0

是否有任何方式来指定图形的方式,我不必使用联合部分? – raeX

+0

一旦你知道那里的图,你可以使用:'GRAPH {... ...格局}'。但要注意是一个合法的完整URI,而不是一些简短的名字(短名解析解析成为完整的URI)。 – AndyS

0

由于@AndyS montionned查询建议工作正常。如果您不想使用union部分,只需按照Andy的建议添加所需图形的名称即可。它应该是这样的:

QueryExecution qExec = QueryExecutionFactory.create(qs1, YourGraphNameHERE)); 
      ResultSet rs = qExec.execSelect() ; 
      ResultSetFormatter.outputAsJSON(rs) ;