Vorrei archiviare il grafico come grafico diretto, che consente di utilizzare le query in modo più efficace. Ovviamente è necessario avere il vincolo che tutti i bordi diretti devono avere un vantaggio di partenariato andando nella direzione opposta.
Class Vertex(db.Model):
#Vertex specific stuff
Class Edge(db.Model):
Start = db.ReferenceProperty(Vertex)
End = db.ReferenceProperty(Vertex)
È quindi possibile tirare fuori tutti i bordi relativi a un vertice specifico con una semplice query:
#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
Nizza e semplice, approfittando del fatto che si sta utilizzando in modo da poter AppEngine lasciare che l'indicizzazione fare un sacco di lavoro per voi;)
Se si vuole fare in modo che il vincolo diretto resta vero, ovviamente, utilizzare un metodo per creare bordi in questo modo:
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()
Affrontare roffles preoccupazioni per la memorizzazione di tutti i bordi per due volte, si potrebbe provare qualcosa di simile:
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.
Questo approccio consente di risparmiare in pratica si spazio di archiviazione (ogni bordo è memorizzata solo una volta) al costo di interrogazione leggermente superiore tempi e un gran numero di messer. Secondo me non è un compromesso molto buono, dal momento che ti stai risparmiando circa 64 byte di storage per edge.
Si prega di spiegare perché pensi che sia inefficiente. Anche per favore chiariscili - fa G.A. supportare le stored procedure? –
Devo eseguire molte query per ottenere tutti i collegamenti al nodo - inoltre sono abbastanza sicuro che App Engine non supporta le stored procedure. – rfw
Perché non archiviare la tua AG come una singola stringa XML, e fai tutto il disimballaggio e il movimento nel normale Python? –