KeyError:“没有Graph的子项,名称为:collection name”

时间:2017-04-06 10:27:41

标签: pyarango

在创建图表时,我看到了这个错误。如何定义集合或图形的子项?

1 个答案:

答案 0 :(得分:1)

我和你一样有同样的问题,整天试图解决这个问题:<

事实证明,这就是事情的运作方式。

让我们假设我们已经联系了一切:

conn = Connection(arangoURL="http://arangodb:8529", username="root", password="secret")
db = conn.createDatabase(name="mydb3")

事实证明,图表与集合的方式不同,即使你可以很容易地创建类型为集合db.createCollection(className="Collection", name="Users")的集合和类型为集合的集合,db.createCollection(className="Edges", name="Follows"),你也不能制作像{ {1}}马上,你可以用收藏品的方式。根据pyArango开发人员编写的代码(以及他那些难以理解的难以理解的文档),您必须先创建解释此特定图形的结构,然后才能创建新图形。你应该通过创建一堆扩展他写的其他类的类来做到这一点。他在his documentation)中写道(含糊地,哈哈):

pyArango的创建者想要我们将在图中使用的特定边和顶点的结构,在我们创建图之前,使用花哨的额外日志记录来声明。 实际上有两种创建集合的方法。在文档中,它表示

db.createGraph(name="Social", createCollections=False)
     

创建一个集合并返回它。 ClassName是继承自Collection或Egdes的类的名称,它也可以是   设置为'Collection'或'Edges'以创建无类型集合   文件或边缘。

他的意思是他实际上打算让你通常制作不像这样的集合: createCollection(className='Collection', waitForSync=False, **colArgs) 但首先创建一个新类,一个扩展集合的类或者边缘,并且在该类中有额外的定义。基本上,当您以特殊方式创建它时,我将向您展示它,它会在元类中记录这些特殊的非默认集合。为了使图形起作用,你不能使用小的默认快捷方式,你必须实际创建类,因为图形事物将检查它们在元类中的存在。在我们创建了扩展Edges和Collection的新类之后,我们现在可以将它们留空。通常,如果开发人员想要在类定义中记录而不是数据库这些集合中的一些字段或其他东西,他会将它们放在这些类扩展中。

db.createCollection(className="Edges", name="Follows")

只有在制作完这些课程后才能创建您的实际馆藏!在制作这些课程之前,您可能很想做class Follows(Edges) : pass class Users(Collection) : pass ,但事实并非如此。这会使pyArango感到困惑。此外,我们将创建一个用于测试的vew顶点,而不是像现在db.createCollection(className="Collection", name="Users")那样以默认方式编写它,如下所示:

db.createCollection(className="Collection", name="Users")

和一些测试边缘:

db.createCollection(className="Users")
doc = db["Users"].createDocument()
doc._key = "custom_key"
doc["name"] = "Tesla"
doc["age"] = "28"
doc.save()
doc = db["Users"].createDocument()
doc._key = "custom_key2"
doc["name"] = "Porsche"
doc.save()

现在,您可以通过这种特定方式扩展图表类来描述图形结构。再一次,不知道_orphanedCollections是什么,但如果我发现,我会告诉你的。以下代码块中的db.createCollection(className="Follows") doc = db["Follows"].createEdge() doc._key = "custom_key" doc["_from"] = "Users/custom_key" doc["_to"] = "Users/custom_key2" doc.save() 必须与'Follows'中的Follows相同,并且与class Follows(Edges) :相同,基本上,您可能将边缘集合命名为除了跟随。 确保这三个位置的名称相同。对于所有用户 - 同样适用于db.createCollection(className="Edges", name="Follows")内部以及您编写课程class Social(Graph)的地方以及任何时候执行类似Users(Collection)的操作 - 所有这些地方都使用同名。因此,如果您决定拥有一个具有不同名称的集合,可能是人物或其他东西,请确保您的代码与其一致。这3个点对应相同的名称。不确定如何。

db["Users"].createDocument()

现在,最后,在遇到所有麻烦后,您将能够写下以下一行:

class Social(Graph):
    _edgeDefinitions = (EdgeDefinition ('Follows', fromCollections = ["Users"], toCollections = ["Users"]), )
    _orphanedCollections = []

请确保您在名称=“社交”的位置使用相同的名称,并且您在之前编写的类社交(图表)的名称对应,因为createGraph会逐字地调用你写的课。当你写name =“Social”时,你将整个类作为参数传递给createGraph。伊克。

无论如何,在遇到所有麻烦之后,现在应该可以了。如果您打开arangodb Web界面,请登录,选择mydb3,然后单击“图表”,您将看到您创建的图表。好极了。

注意:出于某种原因,如果在创建图形后添加新的边和顶点(如下所示),那么在创建图形之前所有的边缘和顶点都会消失。如果我找出原因,我会编辑答案。但就目前而言,只需在之前或之后创建它们。

g = db.createGraph(name="Social", createCollections=False)