簡體   English   中英

Virtuoso Jena提供程序構造查詢錯誤

[英]Virtuoso Jena Provider Construct Query Error

我的問題類似於在此問題上提出的問題: 發送給虛擬端點的CONSTRUCT查詢和發送給耶拿的一個CONSTRUCT查詢之間有區別嗎?

我正在使用Virtuoso開源作為我的圖形存儲,並使用jena提供程序來訪問該圖形存儲中的數據。 我正在執行幾個查詢,並且一切工作正常(除了驚人的內存和時間,需要使用virtuoso進行每個推斷,但這應該在另一個問題中進行……)。

當我嘗試使用構造查詢生成模型時,問題就來了。 我嘗試使用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端點進行了相同的查詢,從而收到了指定的結果。

有人知道哪里可能是錯誤嗎?

謝謝。

丹尼爾。

編輯:這是我要執行的查詢。

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
        } 
    }
} 

如您所見,該查詢嘗試構造一個圖表,其中用戶鏈接到的所有節點的深度最大為五個關系,而鏈接到用戶的節點的深度最大為兩個關系。

您使用哪種方法來創建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的雜注。

通過Virtuoso Jena提供程序使用Construct的工作示例:

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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM