Me gustaría almacenar el gráfico como un gráfico dirigido, lo que le permite utilizar las consultas de manera más efectiva. Obviamente, debe tener la restricción de que todos los bordes dirigidos deben tener un borde asociado en la dirección opuesta.
Class Vertex(db.Model):
#Vertex specific stuff
Class Edge(db.Model):
Start = db.ReferenceProperty(Vertex)
End = db.ReferenceProperty(Vertex)
A continuación, puede sacar todas las aristas relacionadas con un vértice específico con una simple consulta:
#getting all neighbours of a vertex called "foo"
Neighbours = Edge.all()
Neighbours.filter("Start = ", foo)
#neighbours now contains a set of all edges leading from foo
bonito y sencillo, aprovechando el hecho de que está utilizando para que pueda appengine dejar que la indexación hacer una gran parte del trabajo para usted;)
Si desea asegurarse de que la restricción dirigida sigue siendo cierto, obviamente, utilizar un método para crear bordes de esta manera:
LinkVertices(A, B) #A and B are vertices
edgeOne = Edge()
edgeOne.Start = A
edgeOne.End = B
edgeOne.put()
edgeTwo = Edge()
edgeTwo.Start = B
edgeTwo.End = A
edgeTwo.put()
Dirigiéndose roffles preocupaciones acerca del almacenamiento de todos los bordes dos veces, usted podría intentar algo como esto:
Class Edge(db.Model):
A = db.ReferenceProperty(Vertex)
B = db.ReferenceProperty(Vertex)
#getting all neighbours of a vertex called "foo"
Neighbours = Edge.all()
Neighbours.filter("A = ", foo)
OtherNeighbours = Edge.all()
OtherNeighbours.filter("B = ", foo)
#these two queries now contains all edges leading from foo.
Este enfoque básicamente ahorra espacio de almacenamiento (todas las aristas se almacena sólo una vez) a costa de consulta ligeramente más alto veces y mucho código messier. En mi opinión, esa no es una solución muy buena, ya que te estás ahorrando unos 64 bytes de almacenamiento por borde.
Explique por qué piensa que es ineficiente. También por favor ilumine - ¿G.A. apoyar los procedimientos almacenados? –
Tengo que realizar muchas consultas para obtener todos los enlaces al nodo; también estoy bastante seguro de que App Engine no admite los procedimientos almacenados. – rfw
¿Por qué no almacena su AG como una única cadena XML, y hace todo el desempaquetado y el desplazamiento en Python normal? –