【问题标题】:KeyError: "There's no child of Graph by the name of: collection name"KeyError:“没有名称为 Graph 的子项:集合名称”
【发布时间】:2017-04-06 10:27:41
【问题描述】:

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

【问题讨论】:

  • 我正在使用database.createGraph函数

标签: pyarango


【解决方案1】:

我和你有同样的问题,整天都在想办法解决):

事实证明,事情是这样运作的。

让我们假设我们已经连接并且一切都:

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

事实证明,图表与集合完全不同,即使你可以制作 Collection db.createCollection(className="Collection", name="Users") 类型的集合和 Edges 类型的集合,db.createCollection(className="Edges", name="Follows") 真的很容易,但你不能马上制作像 db.createGraph(name="Social", createCollections=False) 这样的图表蝙蝠,你可以用收藏品的方式。根据 pyArango 开发人员编写的代码(以及他真正稀疏难以理解的文档),您必须首先解释此特定图的结构,然后才能制作新图。你应该通过创建一堆扩展他编写的其他类的类来做到这一点。他在his documentation 中写了这个(含糊不清,哈哈):

pyArango 的创建者希望我们将在图中使用的特定边和顶点的结构在我们制作图之前用花哨的额外日志记录来声明。 实际上有两种方法可以创建一个集合。在文档中,它说

createCollection(className='Collection', waitForSync=False, **colArgs)

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

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

class Follows(Edges) :
    pass

class Users(Collection) :
    pass

创建您的实际收藏,只有在您制作这些课程之后!您可能会在制作这些课程之前尝试db.createCollection(className="Collection", name="Users"),但不要这样做。这会让 pyArango 感到困惑。另外,我们不会像现在的db.createCollection(className="Collection", name="Users")那样以默认方式编写它,而是创建一个用于测试的vew顶点,如下所示:

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()

以及一些用于测试的边缘:

db.createCollection(className="Follows")
doc = db["Follows"].createEdge()
doc._key = "custom_key"
doc["_from"] = "Users/custom_key"
doc["_to"] = "Users/custom_key2"
doc.save()

现在是您描述图形结构的部分,通过以这种特定方式扩展图形类来完成。再一次,不知道 _orphanedCollections 是什么,但如果我知道了,我会告诉你的。以下代码块中的'Follows' 必须与class Follows(Edges) : 中的Follows 相同,并且与db.createCollection(className="Edges", name="Follows") 相同,基本上,您可能将边缘集合命名为Follows 以外的名称。 确保这三个位置的名称相同。所有用户也是如此 - 在class Social(Graph) 内部以及您编写类Users(Collection) 的地方以及任何时候您执行db["Users"].createDocument() 之类的操作 - 所有这些地方都使用相同的名称。因此,如果您决定使用不同名称的集合,可能是 People 或其他名称,请确保您在整个代码中与它保持一致。这 3 个点对应同一个名称。不知道怎么做。

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

现在,终于,在经历了这么多麻烦之后,您将能够编写以下代码行:

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

确保在你写 name="Social" 的地方和你之前写的地方使用相同的名字 class Social(Graph) 名称对应,因为 createGraph 从字面上调用它你写的课。当您编写 name="Social" 时,您将整个类作为参数传递给 createGraph。哎呀。

无论如何,经过这么多麻烦,它现在应该可以工作了。如果你打开 arangodb web 界面,登录,选择 mydb3,然后点击“graph”,你会看到你制作的图。耶。

注意:由于某种原因,如果您在创建图形后添加新的边和顶点,(如下所示)您在创建图形之前拥有的所有边和顶点......都会消失。如果我弄清楚原因,我将编辑答案。但是现在,只在之前或之后创建它们。

a = g.createVertex('Users', {"name": 'Toyota',  "_key": 'custom_key6'});
b = g.createVertex('Users',  {"name": 'Honda',    "_key": 'custom_key7'});
g.link('Follows', a, b, {"extra_info": 'testing1', "_key": 'custom_key8'})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多