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