Первоклассные функции
Это не действительно скрытая функция, но то, что функции являются объектами первого класса, является просто большим. Можно раздать их как любая другая переменная.
>>> def jim(phrase):
... return 'Jim says, "%s".' % phrase
>>> def say_something(person, phrase):
... print person(phrase)
>>> say_something(jim, 'hey guys')
'Jim says, "hey guys".'
Вот простейший способ:
class Vertex(db.Model):
outedges = db.ListProperty(db.Key)
# Other information about the vertex here
Теперь вы можете исследовать граф вообще без каких-либо запросов - просто вызовите db.get для одного или нескольких ключей, чтобы получить соответствующие вершины:
# Get the first referenced vertex
vertex2 = db.get(vertex1.outedges[0])
# Get all referenced vertices
vertices = db.get(vertex1.outedges)
В зависимости от количества вершин / ссылок вы можете просто использовать списки вместо создания группы новых сущностей. Проверьте проблемы графа друзей, описанные во второй половине этого видео с Google IO 2009: http://www.youtube.com/watch?v=AgaL6NGpkB8
Если вы считаете, что количество вершин достаточно велико, вы можно просто создать модель Vertex со списком, представляющим соединения.
Учитывая, что вы используете движок приложения Google, было бы лучше, если бы вы сохранили информацию в отдельных таблицах:
Одна для вершин, одна для ссылок из вершины (как вы уже сказано) и еще один, где пути уже вычислены заранее.
GAE работает лучше всего, если информация, которую вы храните, денормализована, поэтому вам не нужно выполнять с ней какие-либо вычисления.