Я тоже немного разбираюсь в стеке и других ресурсах, но я изо всех сил пытаюсь заставить работать конкретный запрос.
у меня есть график со многими родительскими / дочерними отношениями (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