【问题标题】:Jena/Arq: Query Processing get stuckJena/Arq:查询处理卡住了
【发布时间】:2012-08-12 15:11:03
【问题描述】:

如果以下 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)

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

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

【问题讨论】:

    标签: sparql jena arq


    【解决方案1】:

    据推测,数据在内存中。

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

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

    【讨论】:

      【解决方案2】:

      感谢您的回答安迪。 执行计划似乎有问题。现在我正在使用子选择来检索 ?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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多