由于Google App Engine NDB具有目录结构,因此执行此结构以执行每个实体的深度优先遍历的最佳方式是什么。我希望使用ndb和Python编程语言按照这个顺序遍历实体。walk ndb目录结构
1
/| \
2 8 9
/\ \
3 7 10
/| \ /\
4 5 6 11 12
由于Google App Engine NDB具有目录结构,因此执行此结构以执行每个实体的深度优先遍历的最佳方式是什么。我希望使用ndb和Python编程语言按照这个顺序遍历实体。walk ndb目录结构
1
/| \
2 8 9
/\ \
3 7 10
/| \ /\
4 5 6 11 12
ndb没有目录结构。您可以使用祖先键创建树结构,但它将是一棵固定的树,您不能移动元素,父母也不必存在。另外可能有很多根。以这种方式构建的树也将受到写入速度的限制,因为所有元素都属于单个实体组。根据你在做什么,它有正面和负面的。
如果你像这样构建一个树,没有任何机制来获得直接的孩子,所以你将不得不执行和祖先查询,并按键排序,这本质上会给你一个深度第一个你可以循环的实体列表。您可以在对象中存储其他属性,以便限制查询深度。
查看无情的祖先查询 - https://developers.google.com/appengine/docs/python/datastore/queries#Python_Kindless_ancestor_queries。如果所有节点都是相同的类型,那么您可以为节点Kind做一个基本的祖先查询。
你可以得到任何实体的直接父键(假设实体存在,你可以得到父母)。
我在CMS中实现了树,但是我没有使用祖先的密钥。每个父级存储直接的儿童密钥(和名称),以便您可以明确地走树并移动节点。
该文档显示:“数据存储中的实体因此形成类似于文件系统的分层目录结构的分层键空间。”我从https://developers.google.com/appengine/docs/python/ndb/entities获得了此信息。所以从文档中的这个引用我想知道是否有可能走这个分层目录结构。 – john
注意文件说** **类似**不**是**。我也在我的回答中说你可以构建一棵树。我的回答是,没有办法让直系孩子。除非添加其他属性,否则祖先查询是获取所有子项的唯一方法。 –