SPARQL: оптимизация запросов для подзапроса / подмножества - PullRequest
0 голосов
/ 04 июля 2018

Я тоже немного разбираюсь в стеке и других ресурсах, но я изо всех сил пытаюсь заставить работать конкретный запрос.

у меня есть график со многими родительскими / дочерними отношениями (1 миллион узлов); и я хотел бы найти конкретные узлы, а затем проследить до корневого узла.

полный обзор размеров графика

когда я выполняю подзапрос, чтобы получить объем узлов, которые я хочу; я получаю результаты за секунду

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

набор результатов 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
.
}

набор результатов 2

однако, если я попытаюсь объединить оба, запрос занимает много времени, процессор и память проходят через крышу; Я предполагаю, что происходит какой-то декартовский продукт.

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

комбинированный набор результатов

Есть идеи, что мне здесь не хватает?

Thx!

H

...