查找对象到n度的连接

时间:2011-01-18 20:47:30

标签: python django

对于以下型号:

class Entity(models.Model):
    name = models.CharField(max_length=256)

class Entry(models.Model):
    """ A <subj> has a <connection> to an <obj>
    """
    subj = models.ForeignKey(Entity, related_name='subject')
    connection = models.CharField(max_length=512)
    obj = models.ForeignKey(Entity, related_name='object')

我存储了这种数据:

Z的作品 B在Z
工作 B是C
的兄弟 C住在隔壁的D

其中A,B,C,D和Z是实体实例 “work at”等存储在Entry模型的“关系”字段中。

现在,我如何在A和D之间找到一个链接,考虑到所有实体之间有很多连接?我希望能打印出类似的内容:

A连接到4度的D (同时显示步骤)。

我将此标记为Django问题,因为其目的是在Django支持的网站上使用它,但我想知道Django的ORM是否可以在这里提供帮助。

提前致谢!

3 个答案:

答案 0 :(得分:1)

这是一个图论问题。您的模型表示连接节点的边,您想要查找节点之间的路径。这种东西有python库,比如Boost库的python接口。

阅读图论,并查看相关的python包。您需要的搜索算法将是广度或深度优先搜索。

答案 1 :(得分:0)

您需要查看像修改的预订树遍历这样的算法,它允许您将此类信息存储在数据库中。有一个很好的Django实现叫做django-mptt

答案 2 :(得分:0)

对于碰巧偶然发现这些问题的人:http://www.python.org/doc/essays/graphs/的文章非常有帮助。图中的字典将实体作为键,将实体列表作为其路径。

使用上面引用的文章中显示的find_all_paths函数,我能够完全按照自己的意愿行事。感谢大家的指点。