2016-09-28 66 views
3

我有一个相当复杂的SPARQL查询,它在并行线程(400线程)中执行了数千次。为便于阅读,查询在这里有所简化(名称空间,属性和变量已被减少),但复杂性保持不变(联合,图表数量等)。该查询是针对4个图表运行的,其中最大的包含5,561,181个三元组。复杂的SPARQL查询 - Virtuoso性能提示?

PREFIX graphA: <GraphABaseURI:> 

ASK 
FROM NAMED <GraphBURI> 
FROM NAMED <GraphCURI> 
FROM NAMED <GraphABaseURI> 
FROM NAMED <GraphDBaseURI> 
WHERE{ 
    { 
     GRAPH <GraphABaseURI>{ 
     ?variableA a graphA:ClassA . 
     ?variableA graphA:propertyA ?variableB . 
     ?variableB dcterms:title ?variableC . 
     ?variableA graphA:propertyB ?variableD . 
     ?variableL<GraphABaseURI:propertyB> ?variableD . 
     ?variableD <propertyBURI> ?variableE 
     } 
     . 
     GRAPH <GraphBURI>{ 
     ?variableF <propertyCURI>/<propertyDURI> ?variableG . 
     ?variableF <propertyEURI> ?variableH 
     } 
     . 
     GRAPH <GraphCURI>{ 
     ?variableI <http://www.w3.org/2004/02/skos/core#notation> ?variableJ . 
     ?variableI <http://www.w3.org/2004/02/skos/core#prefLabel> ?variableK . 
     FILTER (isLiteral(?variableK) && REGEX(?variableK, "literalA", "i")) 
     } 
     . 
     FILTER (isLiteral(?variableJ) && ?variableG = ?variableJ) . 
     FILTER (?variableE = ?variableH) 
    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyFURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 

    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyIURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 
    } 
    . FILTER (isLiteral(?variableC) && REGEX(?variableC, "literalB", "i")) . 
} 

我不希望有人改变上述查询(当然......)。我只发布查询来演示复杂性和所有使用的SPARQL结构。

我的问题:

  1. 我会获得有关性能,如果我有我的一个图中所有三元?这样我就可以避免工会并简化我的查询,但是,这样做是否也会在性能方面受益?
  2. 有没有我可以建立的任何种类的索引,他们可以对上述查询有帮助?我对数据索引并不是很有信心,但是在the RDF Index Scheme section of RDF Performance Tuning中阅读,我不知道Virtuoso 7的默认索引方案是否适用于上述查询。虽然谓词是在上述查询的SPARQL三元模式中定义的,但有许多三元模式尚未定义主题或谓词。这可能是性能方面的一个主要问题吗?
  3. 也许有一个SPARQL语法结构,我不知道,并可能在上述查询很大的帮助。你能提出一些建议吗?例如,我已经通过删除STR()强制转换和使用isLiteral()函数来提高性能。你能提出其他建议吗?
  4. 也许你可以建议过度使用复杂的SPARQL语法结构?

请注意,我用的Virtuoso开源版,内置在Ubuntu,版本:07.20.3214,构建:10月14日2015年

问候, 潘泰利斯Natsiavas

回答

4

的第一件事情 - 你Virtuoso的构建早已过时;强烈建议更新至7.20.3217 as of April 2016(或更高版本)。看着简化查询时

优化建议自然是有限的,但这里有几个想法,没有特定的顺序...

  • Index Scheme Selection,以下RDF Index Scheme的RDF性能调优文档部分,提供了一个可能对您的查询和数据有意义的替代和/或附加索引。如您所说,某些模式将定义图形和对象,以及未定义的主题和谓词,其他一些索引可能也有意义(例如,GOPS,GOSP),具体取决于其他因素。

  • 根据您的数据在原始加载后发生了多少变化,使用此SQL命令(可以通过任何SQL接口(iSQL,ODBC,JDBC等)发布,可能值得重建自由文本索引。) -

    VT_INC_INDEX_DB_DBA_RDF_OBJ() 
    
  • Using the bif:contains predicate可能导致比regex()过滤器显着更好的性能,例如更换 -

    FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) . 
    

    - 与 -

    ?variableO bif:contains "'literalA'" . 
    FILTER (isLiteral(?variableO)) . 
    
  • Explain() and profile()可以在查询优化有帮助努力。这些输出中的大部分都是用于开发分析的,所以对您来说可能没有多大意义,但是将其提供给other Virtuoso users仍然可以提供有用的建议。

  • 由于多种原因,rdf:type谓词(通常表示为a,归功于SPARQL /海龟语义糖)可能是一个性能杀手。从图形模式中删除这些谓词可能会大幅提升性能。如果需要,还可以通过其他方法来限制解决方案集(例如通过测试仅由您期望的实体拥有的属性),这些属性不会产生如此负面的性能影响。

(ObDisclaimer:OpenLink Software产生Virtuoso,并且采用我)