Я работал в исследовательской группе , заинтересованной, среди прочего, в разработке базы данных для данных RDF (S), которая в основном помечена как графы или тройки [субъект, предикат, объект], которые в основном ребра графа: [sourceNode, edgeLabel, targetNode].
Вопрос, который нужно задать, чтобы оценить сложность проблемы: какие индексы вы собираетесь построить для помеченного графика? У вас есть , чтобы воспользоваться преимуществами общих "свойств" (каждый "предикат" является свойством субъекта со значением объекта) и соответствующим образом индексировать ребра, чтобы вы могли быстро найти, существует ли "объект". edge с именем hasAge для Person со значением больше 18 ".
Для иллюстрации приведем простой подход, который не учитывает схемы (и идет совершенно в противоположном направлении традиционного исследования баз данных, в котором совершенно единодушно соглашается, что схемы хороши ). Он полностью игнорирует любую информацию схемы ( этот документ предоставляет полезный контекст). Просто храните все в трех больших таблицах (s: subject, p: предикат, o: object):
- [s, p, o]
- [p, o, s]
- [o, s, p]
Этих трех достаточно, чтобы ответить на любой, эффективно оценить любой запрос с (не более) субъектом, (не более) предикатом и (не более) объектом (то есть запросами вида (s, *, *)
, (*, p, *)
, (*, *, o)
, (s, p, *)
, (s, *, o)
, (*, p, o)
, (s, p, o)
). Сложные запросы состоят из множества «выражений пути» (т. Е. Вы описываете данные, для которых вы можете найти определенные пути, удовлетворяющие некоторым критериям), каждый из которых транслируется в самообъединение на одной из этих (больших!) Таблиц, которая не является все это эффективно, что является проблемой.
Это простая графическая база данных в кармане. :)
В заключение, это область активных исследований. Я не в курсе современного уровня техники, но я видел такие продукты, как AllegroGraph и другие, которые требуют очень хороших результатов.