Virtuoso Jena Provider Construct Query Error

1

Моя проблема аналогична задаче, заданной по этому вопросу: существует ли разница между запросами CONSTRUCT, отправленными на конечную точку виртуоза, и одна, отправленная на Йену?

Я использую Virtuoso opensource в качестве своего графического магазина и использую поставщика jena для доступа к данным в этом графическом магазине. Я делаю несколько запросов, и все работает нормально (за исключением огромного количества памяти и времени, которое берет каждый вывод с виртуозом, но это должно идти по другому вопросу...).

Проблема возникла, когда я попытался создать модель, используя запрос конструкции. Я попробовал использовать VirtuosoQueryExecutionFactory и запрос как строку и по умолчанию QueryExecutionFactory с фабрикой запросов:

qexec = VirtuosoQueryExecutionFactory.create(queryString,inputModel);

model = qexec.execConstruct();

А также

Query query = QueryFactory.create(queryString);
qexec = QueryExecutionFactory.create(query,inputModel);

model = qexec.execConstruct();

Запрос дает ожидаемый результат в конечной точке sparql, но пустую модель при запросе кода.

LOGGER.info("The model is: {}", model);
LOGGER.info("The size is: {}", model.size());

Дает следующий результат:

The model is: <ModelCom   {} | >
The size is: 0

Модель, в которой я выполняю запросы, не пуста, и я сделал тот же запрос из конечной точки sparql, как я уже сказал, для получения результатов.

Кто-нибудь знает, где может быть ошибка?

Благодарю.

Дэниел.

EDIT: Вот запрос, который я пытаюсь выполнить.

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl:<http://www.w3.org/2002/07/owl#> 
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>  
PREFIX spatiaCore:<http://www.cedint.upm.es/residentialontology.owl#> 
PREFIX test:<http://test.url#> 
PREFIX spatiaCore: <http://www.cedint.upm.es/residentialontology.owl#> 
CONSTRUCT { 
    ?u ?p ?o1. 
    ?o1 ?p2 ?o2. 
    ?o2 ?p3 ?o3. 
    ?o3 ?p4 ?o4. 
    ?o4 ?p5 ?o5. 
    ?o6 ?p6 ?u. 
    ?o7 ?p7 ?o6
}  

WHERE { 
    ?u rdf:type spatiaCore:User. 
    ?u spatiaCore:id "0000000003B3B474"^^<http://www.w3.org/2001/XMLSchema#string>. 
    ?u ?p ?o1.
    OPTIONAL { 
        ?o1 ?p2 ?o2. 
        OPTIONAL {   
            ?o2 ?p3 ?o3.  
            OPTIONAL {
                ?o3 ?p4 ?o4.  
                OPTIONAL {
                    ?o4 ?p5 ?o5. 
                }
            }
        }
    }
    OPTIONAL { 
        ?o6 ?p6 ?u. 
        OPTIONAL {
            ?o7 ?p7 ?o6
        } 
    }
} 

Как вы можете видеть, запрос пытается построить граф со всеми узлами, к которым пользователь привязан, с глубиной до пяти отношений и узлами, которые связаны с пользователем с глубиной макс двух отношений.

Теги:
jena
sparql
virtuoso

1 ответ

1
Лучший ответ

Какой метод вы использовали для создания объекта VirtModel?

ЗАМЕТКА:

Если вы использовали:

public static VirtModel openDefaultModel(DataSource ds);
public static VirtModel openDefaultModel(String url, String user, String password);

поэтому модель будет содержать только данные из графика "virt: DEFAULT". И VirtuosoQueryExecutionFactory добавит следующую прагму для запроса текста:

define input:default-graph-uri <virt:DEFAULT>

Если вы использовали что-то вроде:

public static VirtModel openDatabaseModel(String graphName, DataSource ds);
public static VirtModel openDatabaseModel(String graphName, String url, String user, String password) 

поэтому модель будет содержать только данные из графика graphName. И VirtuosoQueryExecutionFactory добавит следующую прагму для запроса текста:

define input:default-graph-uri <graphName>

Если вы хотите использовать данные со всех графиков, вы должны позвонить:

VirtModel vmodel = ....create model method...
vmodel.setReadFromAllGraphs(true);

Если вы установите значение TRUE, прагма для default-graph-uri не будет добавлена.

Проработанный пример использования Construct с Virtuoso Jena:

url = "jdbc:virtuoso://localhost:1111";
VirtGraph set = new VirtGraph ("test1", url, "dba", "dba");

set.clear();

String qry = "INSERT INTO GRAPH <test1> { <aa> <bb> 'cc' . <aa1> <bb> 'zz' }";
VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(qry, set);
vur.exec();                  

Model inputModel = new VirtModel(set);
System.out.println("InputModel :"+inputModel);
System.out.println("InputModel size :"+inputModel.size());
System.out.println();


qry = "CONSTRUCT { ?x <a> ?y } WHERE { ?x <bb> ?y }";
QueryExecution vqe = VirtuosoQueryExecutionFactory.create (qry, inputModel);

Model model = vqe.execConstruct();
System.out.println("Model :"+model);
System.out.println("Model size :"+model.size());
  • 0
    На самом деле я не использую ни один из этих методов. Я использовал следующий код для извлечения данных в модель. VirtGraph graph = new VirtGraph(String graphName, String url_host, String user, String password) Model inputModel = new VirtModel(VirtGraph graph) Так что я думаю, что с этим я просто могу читать и писать в графике, с которым я работаю.
  • 0
    Я обновил пример выше, может быть, это поможет вам.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню