Есть ли какая-нибудь структура данных или база данных, которая может обрабатывать операторы выражения пути и запросы выражений пути?

Мне нужно смоделировать граф (или его можно было бы рассматривать как рекурсивное дерево (а), поскольку обычно это один или небольшое количество корней) на основе вещей, имеющих потомков:

a hasChildren (b, c)
b hasChildren (d, e)
c hasChildren (f, g)
d hasChildren (h, a)

Теперь есть неявные пути, a / c / f, а также рекурсивные: a / b / d / a / b / d / ...

И затем мне нужно установить элементы на графике с помощью выражения пути, оба свойства о них (эти пути имеют цвет: blue или что-то в этом роде), а также изменение их дочерних элементов - возможно, удаление / скрытие их или добавление новых детей.

Под выражением пути я имею в виду что-то вроде этого:

a/b/** -> color = "blue"

означает, что все пути, начинающиеся с a / b /, имеют свойство color = "blue". Итак, если я запросил цвет a / b / d / a / b / d / a, он вернет синий. Но если бы я спросил цвет только a, на данный момент его нет.

Другие выражения могут быть такими:

**/d/h
a/b/[color="blue"]
a/**/h

Итак, это будет использоваться для составления утверждений. Мне нужен аналогичный способ выполнения запросов. Мне нужны простые запросы, такие как:

a/b/d

, и более сложные, например:

a/**[color="blue"]  -- descendants that have attribute color = "blue". This could be infinite in recursive case so we can put a restriction on this type of query to have it make sense, like does such a path exist, or just return first one or something.

Кроме того, в любое время могут быть добавлены дополнительные узлы.

a hasChildren (b, c, x, y, z)

Мне нужны запросы после этого, чтобы должным образом соответствовать всем операторам. Другими словами, я не могу просто запустить запрос и установить свойство для всех результатов, поскольку тогда оно не будет применяться к новым вещам, добавленным позже.

И, конечно, мне нужно, чтобы это было очень быстро :) Я бы имел порядка 1000 узлов, 1000 операторов выражения пути и запрос на 100 000 выражений пути.

Есть ли что-то, что хорошо справляется с подобными вещами?

Я изучал такие вещи, как RDF / OWL, но, похоже, он не поддерживает пути.

5
задан mentics 18 November 2011 в 20:22
поделиться