SPARQL:子查询/子集的查询优化

时间:2018-07-04 16:03:45

标签: sparql rdf query-performance

我一直在研究stackoverflow以及其他各种资源,但我一直在努力使特定查询正常工作。

我有一个具有许多父/子关系的图(1 milj个节点);而且我想找到特定的节点,然后追溯到根节点。

full graph size overview

当我执行子查询时,获取我想要的节点范围;我得到亚秒级结果

select distinct ?af_node 
            # ?word_value
      where {

        {
            select  ?af_node ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeTurnoverSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "NumberOfEmployees";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "Turnover";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeTurnoverSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "AnnualAccountsFlag";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      }      

resultset 1

现在,当我只使用一个节点并将其跟随回到根节点时,我仍然会得到亚秒级的结果。结果是一条很短的路,但是其他水平超过10级的人。

 select *
 where {

 ?af_node <cd:is_a> <http://site.eu/entity-type#ArteFact>;
         <cd:identifier>    "efac028c-ae79-4837-bb2a-01f8a12c5924";
        <cd:has_root>+ ?af_node_root
.
}

result set 2

但是,如果我尝试将两者结合起来,查询会花费很多时间,CPU和内存会消耗很多时间;我猜想正在发生某种笛卡尔积。

select *
where {


  ?af_node <cd:is_a> <http://site.eu/entity-type#ArteFact>;
           <cd:identifier>  "450285fa-9390-41d7-ad51-006624c43db2"
  .
  filter exists {      
     select distinct ?af_node 
            # ?word_value
      where {

        {
            select  ?af_node ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeTurnoverSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "NumberOfEmployees";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "Turnover";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "CompanySizeTurnoverSegmentation";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      union
        {
            select  ?af_node  ?word_value
            where {

              ?word <cd:is_a>   <http://site.eu/entity-type#Word>;
                    <cd:value> "AnnualAccountsFlag";
                    <cd:value> ?word_value;
                    <cd:is_related_to> ?af_sentence
              .
              ?af_sentence <cd:is_a> <http://site.eu/entity-type#SentenceWord>;
                           <cd:belongs_to> ?af_node
            }
        }
      }
  }
  .    
  ?af_node <cd:has_root>+ ?af_node_root
  .
}

combined result set

知道我在这里缺少什么吗?

谢谢!

H

0 个答案:

没有答案