После создания графа RDF с использованием RDFLib в python для применения онтологии датчика (я использовал для этого онтологию датчика, также использовал пространство имен и Bnode, который представляет собой пустой узел, представляющий ресурс, для которого не указан URI или литерал). Я попытался запросить данные в java с помощью sparql, поэтому сначала мне пришлось сохранить график с помощью 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" .

Я также попробовал другой график, который использует онтологию друга друга, и он работает нормально и правильно. возможно ли, что Bnode вызывает эту проблему?

0
raeX 20 Апр 2016 в 17:59

2 ответа

Лучший ответ

Попробуйте: SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

Ваши комментарии предполагают, что данные находятся в именованном графе, но вы задали запрос только безымянного / стандартного графа. Предлагаемый запрос находит все в любом месте набора данных.

2
AndyS 20 Апр 2016 в 21:15

Как отметил @AndyS, предложенный запрос работает нормально. Если вы не хотите использовать объединение, просто сделайте так, как предложил Энди, добавив имя нужного графа. Должно получиться так:

QueryExecution qExec = QueryExecutionFactory.create(qs1, YourGraphNameHERE));
            ResultSet rs = qExec.execSelect() ;
             ResultSetFormatter.outputAsJSON(rs) ;
0
raeX 22 Апр 2016 в 18:26