Sparql Jena/Arq:查询处理陷入困境

Sparql Jena/Arq:查询处理陷入困境,sparql,jena,arq,Sparql,Jena,Arq,如果您对以下SPARQL查询有问题: PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PRE

如果您对以下SPARQL查询有问题:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX :<http://www.test.at/DA.owl#>
SELECT ?ModuleName ?SLAName ?SLOName ?SLOTypeName ?SLOTHV (AVG(DISTINCT ?SLTTV) AS ?AVGTrackValue)  (COUNT(DISTINCT ?SLT) AS ?SLTCOUNT) 
WHERE {
    ?Module rdf:type :ServiceModule .
    ?SLA rdf:type :ServiceLevelAgreement.
    ?SLO rdf:type :ServiceLevelObjective .
    ?SLT rdf:type :ServiceLevelTracking .
    ?Day rdf:type :Day .
    ?Holiday rdf:type :Holiday .
    ?rel1 rdf:type :RelationFact .
    ?rel2 rdf:type :RelationFact .
    ?rel3 rdf:type :RelationFact .
    ?rel4 rdf:type :RelationFact .
    ?rel5 rdf:type :RelationFact .
    ?Module :hasName ?ModuleName .
    ?SLA :hasName ?SLAName .
    ?SLO :hasName ?SLOName .
    ?SLO :hasType ?SLOType . 
    ?SLO :hasThresholdValue ?SLOTHV .
    ?SLOType :hasName ?SLOTypeName .            
    ?SLT :hasDayName ?SLTDayName .
    ?SLT :hasType ?SLTType .        
    ?SLT :hasTrackedDateTime ?trackTime .
    ?SLT :hasTrackedValue ?SLTTV .
    ?Day :hasDayName ?DayName .
    ?Holiday :hasDate ?HolidayDate .
    ?Holiday :hasStartTime ?HolidayStartTime .
    ?Holiday :hasEndTime ?HolidayEndTime .      
    ?rel1 :hasParent ?Module .
    ?rel1 :hasChild ?SLA .  
    ?rel2 :hasParent ?Module.
    ?rel2 :hasChild ?SLT .      
    ?rel3 :hasParent ?SLA .
    ?rel3 :hasChild ?SLO .
    ?rel4 :hasParent ?SLA .
    ?rel4 :hasChild ?Day .
    ?rel5 :hasParent ?SLA .
    ?rel5 :hasChild ?Holiday .  
    Filter(regex(str(?ModuleName), "E-mail")) .
    Filter(?SLOType = ?SLTType) .
    Filter(xsd:dateTime(?trackTime)  >=  xsd:dateTime("2012-08-15T12:00:00") && ?trackTime  <  xsd:dateTime("2012-08-15T13:00:00")) .
    Filter(?DayName = ?SLTDayName || (xsd:dateTime("2012-08-15T00:00:00") = ?HolidayDate && xsd:dateTime(?trackTime) >= xsd:dateTime("2012-08-15T12:00:00") &&  xsd:dateTime(?trackTime) < xsd:dateTime("2012-08-15T14:00:00")))
} 
GROUP BY ?ModuleName ?SLAName ?SLOName ?SLOTypeName ?SLOTHV
HAVING (?AVGTrackValue < ?SLOTHV)
前缀rdf:
前缀owl:
前缀xsd:
前缀rdfs:
前缀:
选择?ModuleName?SlName?SLOName?SLOTypeName?SLOTHV(平均值(不同的?SLTTV)作为?AVGTrackValue)(计数(不同的?SLT)作为?SLT计数)
在哪里{
?模块rdf:类型:服务模块。
?SLA rdf:类型:ServiceLevelAgreement。
?SLO rdf:类型:ServiceLevelObjective。
?SLT rdf:类型:ServiceLevelTracking。
?日rdf:类型:日。
?假日rdf:类型:假日。
?rel1 rdf:类型:RelationFact。
?rel2 rdf:类型:RelationFact。
?rel3 rdf:类型:RelationFact。
?rel4 rdf:类型:RelationFact。
?rel5 rdf:类型:RelationFact。
?模块:hasName?模块名。
SLA:hasName?slame。
SLO:hasName?SLOName。
?SLO:hasType?SLOType。
?SLO:hasThresholdValue?SLOTHV。
?SLOType:hasName?SLOTypeName。
?SLT:hasDayName?SLTDayName。
?SLT:hasType?SLTType。
?SLT:hasTrackedDateTime?trackTime。
?SLT:hasTrackedValue?SLTTV。
日期:hasDayName?DayName。
?假日:hasDate?HolidayDate。
假期:开始时间?假期开始时间。
?假日:hasEndTime?假日EndTime。
?rel1:hasParent?模块。
?rel1:hasChild?SLA。
?rel2:hasParent?模块。
?rel2:hasChild?SLT。
?rel3:hasParent?SLA。
?rel3:hasChild?SLO。
?rel4:hasParent?SLA。
?rel4:hasChild?日。
?rel5:hasParent?SLA。
?rel5:有孩子?假期。
过滤器(regex(str(?ModuleName),“E-mail”))。
过滤器(?SLOType=?SLTType)。
过滤器(xsd:dateTime(?trackTime)>=xsd:dateTime(“2012-08-15T12:00:00”)&&trackTime=xsd:dateTime(“2012-08-15T12:00:00”)&&xsd:dateTime(?trackTime)
在potégé4.2中,该查询可以正常工作,并在1秒内返回结果。此外,还需要使用SPARQLer查询验证程序进行语法检查(http://www.sparql.org/query-validator.html)表示SPARQL查询有效。但是在jena arq引擎中,在等待结果集时,查询处理一直处于停滞状态。我在命令行中使用jena-arq-2.9.1进行了尝试,并在java应用程序中使用了以下代码:

    Query q = QueryFactory.create(queryString);
    QueryExecution qexec = QueryExecutionFactory.create(q, currentOntologyModel);
    try {
        ResultSet results = qexec.execSelect();
        while (results.hasNext()) {
            QuerySolution soln = results.nextSolution();
            .
            .
            .
            <some other code>
            .
            .
            .
            }
        }
    } finally {
        qexec.close();
    }
queryq=QueryFactory.create(queryString);
QueryExecution qexec=QueryExecutionFactory.create(q,currentOntologyModel);
试一试{
ResultSet results=qexec.execSelect();
while(results.hasNext()){
QuerySolution soln=results.nextSolution();
.
.
.
.
.
.
}
}
}最后{
qexec.close();
}

也许有人知道问题出在哪里。

大概数据在内存中

查询优化器似乎没有找到有效的计划。开始时所有未连接的
rdf:type
都可能导致计算效率低下的中间叉积


重新排列三重模式可能会有所帮助(mayeb将rdf:type移到末尾?查询本身还不足以知道-它取决于数据)。如果您发现更快的订单,请将其发送到Apache的jena用户列表。

谢谢您的回答。 这似乎是执行计划的问题。现在我使用一个子选择来检索?SLT的数据,查询工作得非常好。这是现在可用的查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX :<http://www.test.at/DA.owl#>
SELECT ?ModuleName ?SLAName ?SLOName ?SLOTypeName ?SLOTHV (AVG(DISTINCT ?SLTTV) AS     ?AVGTrackValue)  (COUNT(DISTINCT ?SLT) AS ?SLTCOUNT) 
WHERE {
?Module rdf:type :ServiceModule .
?SLA rdf:type :ServiceLevelAgreement.
?SLO rdf:type :ServiceLevelObjective .
?Day rdf:type :Day .
?Holiday rdf:type :Holiday .
?rel1 rdf:type :RelationFact .
?rel3 rdf:type :RelationFact .
?rel4 rdf:type :RelationFact .
?rel5 rdf:type :RelationFact .
?Module :hasName ?ModuleName .
?SLA :hasName ?SLAName .
?SLO :hasName ?SLOName .
?SLO :hasType ?SLOType . 
?SLO :hasThresholdValue ?SLOTHV .
?SLOType :hasName ?SLOTypeName .            
?SLT :hasDayName ?SLTDayName .
?SLT :hasType ?SLTType .        
?SLT :hasTrackedDateTime ?trackTime .
?SLT :hasTrackedValue ?SLTTV .
?Day :hasDayName ?DayName .
?Holiday :hasDate ?HolidayDate .
?Holiday :hasStartTime ?HolidayStartTime .
?Holiday :hasEndTime ?HolidayEndTime .      
?rel1 :hasParent ?Module .
?rel1 :hasChild ?SLA .     
?rel3 :hasParent ?SLA .
?rel3 :hasChild ?SLO .
?rel4 :hasParent ?SLA .
?rel4 :hasChild ?Day .
?rel5 :hasParent ?SLA .
?rel5 :hasChild ?Holiday .
{
    SELECT ?SLT ?SLTType ?ModuleName
    WHERE {
    ?SLT rdf:type :ServiceLevelTracking .
    ?rel2 rdf:type :RelationFact .
    ?Module :hasName ?ModuleName .
    Filter(regex(str(?ModuleName), "E-mail")) .
    ?rel2 :hasParent ?Module.
    ?rel2 :hasChild ?SLT    
    }
}   
Filter(?SLOType = ?SLTType) .
Filter(xsd:dateTime(?trackTime)  >=  xsd:dateTime("2012-08-15T12:00:00") && ?trackTime  <  xsd:dateTime("2012-08-15T13:00:00")) .
Filter(?DayName = ?SLTDayName || (xsd:dateTime("2012-08-15T00:00:00") = ?HolidayDate && xsd:dateTime(?trackTime) >= xsd:dateTime("2012-08-15T12:00:00") &&  xsd:dateTime(?trackTime) < xsd:dateTime("2012-08-15T14:00:00")))
} 
GROUP BY ?ModuleName ?SLAName ?SLOName ?SLOTypeName ?SLOTHV
HAVING (?AVGTrackValue < ?SLOTHV)
前缀rdf:
前缀owl:
前缀xsd:
前缀rdfs:
前缀:
选择?ModuleName?SlName?SLOName?SLOTypeName?SLOTHV(平均值(不同的?SLTTV)作为?AVGTrackValue)(计数(不同的?SLT)作为?SLT计数)
在哪里{
?模块rdf:类型:服务模块。
?SLA rdf:类型:ServiceLevelAgreement。
?SLO rdf:类型:ServiceLevelObjective。
?日rdf:类型:日。
?假日rdf:类型:假日。
?rel1 rdf:类型:RelationFact。
?rel3 rdf:类型:RelationFact。
?rel4 rdf:类型:RelationFact。
?rel5 rdf:类型:RelationFact。
?模块:hasName?模块名。
SLA:hasName?slame。
SLO:hasName?SLOName。
?SLO:hasType?SLOType。
?SLO:hasThresholdValue?SLOTHV。
?SLOType:hasName?SLOTypeName。
?SLT:hasDayName?SLTDayName。
?SLT:hasType?SLTType。
?SLT:hasTrackedDateTime?trackTime。
?SLT:hasTrackedValue?SLTTV。
日期:hasDayName?DayName。
?假日:hasDate?HolidayDate。
假期:开始时间?假期开始时间。
?假日:hasEndTime?假日EndTime。
?rel1:hasParent?模块。
?rel1:hasChild?SLA。
?rel3:hasParent?SLA。
?rel3:hasChild?SLO。
?rel4:hasParent?SLA。
?rel4:hasChild?日。
?rel5:hasParent?SLA。
?rel5:有孩子?假期。
{
选择?SLT?SLT类型?模块名称
在哪里{
?SLT rdf:类型:ServiceLevelTracking。
?rel2 rdf:类型:RelationFact。
?模块:hasName?模块名。
过滤器(regex(str(?ModuleName),“E-mail”))。
?rel2:hasParent?模块。
?rel2:hasChild?SLT
}
}   
过滤器(?SLOType=?SLTType)。
过滤器(xsd:dateTime(?trackTime)>=xsd:dateTime(“2012-08-15T12:00:00”)&&trackTime=xsd:dateTime(“2012-08-15T12:00:00”)&&xsd:dateTime(?trackTime)