首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在GAE数据存储中存储有向、加权、完整的图

在GAE数据存储中存储有向、加权、完整的图
EN

Stack Overflow用户
提问于 2011-07-23 13:42:59
回答 1查看 585关注 0票数 1

我有一个有向的,有权的,有100个顶点的完整图。顶点表示影片,边表示两部影片之间的首选项。每次用户访问我的站点时,我都会查询一组5个顶点以显示给用户(这组顶点经常变化)。让我们将这些顶点称为A,B,C,D,E。用户对它们进行排序(即从最喜欢的电影到最不喜欢的电影)。例如,他可能会将它们排序为D、B、A、C、E。然后,我需要按如下方式更新图表:

代码语言:javascript
运行
复制
Graph[D][B] +=1
Graph[B][A] +=1
Graph[A][C] +=1
Graph[C][E] +=1

因此,count GraphV1最终表示有多少用户将(电影) V1排在(电影) V2之上。当收集到数据后,我可以进行各种离线图形分析,例如找到图形的汇和源,以确定最受欢迎和最不受欢迎的电影。

问题是:如何在数据存储中存储有向的、加权的、完整的图?显而易见的答案是:

代码语言:javascript
运行
复制
class Vertex(db.Model):
    name = db.StringProperty()

class Edge(db.Model):
    better = db.ReferenceProperty(Vertex, collection_name = 'better_set')
    worse = db.ReferenceProperty(Vertex, collection_name = 'worse_set')
    count = db.IntegerProperty()

但我看到的问题是,我必须进行4个单独的丑陋查询,如下所示:

代码语言:javascript
运行
复制
edge = Edge.all().filter('better =', vertex1).filter('worse =', vertex2).get()

然后我需要在第五个查询中更新并放入()新的边。

一个更有效(查询更少)但很麻烦的实现是这样的,它使用成对的列表来模拟字典:

代码语言:javascript
运行
复制
class Vertex(db.Model):
    name = db.StringProperty()
    better_keys = db.ListProperty(db.Key)
    better_values = db.ListProperty(int)

因此,要添加一个分数,说明A比B更好,我会这样做:

代码语言:javascript
运行
复制
index = vertexA.index(vertexB.key())
vertexA.better_values[index] += 1

有没有更有效的方法来模拟这一点?

EN

Stack Overflow用户

回答已采纳

发布于 2011-07-25 05:03:54

我解决了我自己的问题,对我在问题中建议的第一个设计进行了很小的修改。

我了解了key_name参数,它允许我设置自己的键名。因此,每次我创建一个新的边时,我都会将以下参数传递给构造函数:

代码语言:javascript
运行
复制
key_name = vertex1.name + ' > ' + vertex2.name

然后,不是多次运行这个查询:

代码语言:javascript
运行
复制
edge = Edge.all().filter('better =', vertex1).filter('worse =', vertex2).get()

我可以很容易地检索边,因为我知道如何构造它们的键。使用Key.from_path()方法,我构造了一个引用边的键的列表。每个密钥都是这样获得的:

代码语言:javascript
运行
复制
db.Key.from_path('Edge', vertex1.name + ' > ' + vertex2.name)

然后,我传递该键列表,以在一个查询中获取所有对象。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6798490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档