Описание проблемы
Я реализую алгоритм анализа ссылок на огромной базе данных графа.
База данных графа состоит из сущностей (вершин) и отношений(ребра).
Каждый тип сущности имеет свойства.Например, Персона: [возраст, рост, вес] .
Каждое отношение также имеет свойства: Например, Вызов (телефон, телефон): [дата, продолжительность] или Own (Person, Phone): [дата начала, дата окончания].
Теперь мне дан шаблон со следующей структурой:
[тип объекта,ограничения] [тип отношения, ограничения] [тип объекта, ограничения] [тип отношения, ограничения] ... [тип объекта, ограничения]
Например:
[человек, возраст> 20] [свой, дата начала> 01.01.2010] [телефон, заканчивается на «5»] [дата звонка> 01.01.2010] [телефон, начинается на «6'] [принадлежит, дата начала <1/2/2011] [person, height> 40] .
Мне нужно найти ВСЕ действительные назначения для всех сущностей и отношений в шаблоне.
Я могу запросить базу данных, используя следующие примитивы:
- Найти первые 1000 [тип объекта, тип отношения, тип объекта] назначения дляданный набор ограничений.
- Найти следующую 1000 длявышеуказанные
- Найти первые [конкретные сущности, отношения типа, сущности типа] назначения для данного набора ограничений.
- Найти следующие 1000 для вышеупомянутых
Сохранение всех ответов на данный запрос в оперативной памяти невозможно.Может быть миллионы (миллиарды?) Назначений для каждой тройки сущность-связь-сущность.Тем не менее, число назначений для всего шаблона предполагается небольшим.
Что я пробовал:
Для цепочки ET1-RT1-ET2-RT2-ET3-RT3 ... Наивной реализацией будет:
Get first 1000 (ET1-RT1-ET2)
for each concrete ET2:
Get first 1000 (ET2-RT2-ET3)
for each concrete ET3:
...
Проблема в том, что я могу решать одни и те же подзадачи более одного раза.
IЯ ищу алгоритм, который устраняет такие избыточности, который также экономит память.
Примечание:
Я ищу алгоритм.Не для ответа, такого как «Использовать SQL JOIN» / «Использовать SPARQL» ...