2

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

4

1 回答 1

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 开发人员编写的代码(以及他真正稀疏难以理解的文档),您必须首先解释此特定图的结构,然后才能制作新图。你应该通过创建一堆扩展他编写的其他类的类来做到这一点。他在他的文档中写了这个(含糊地,大声笑):

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'的代码块中的 in 必须与Followsin 相同,class Follows(Edges) :并且与 相同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 " 的位置使用相同的名称,并且在您之前编写类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'})
于 2017-05-04T17:06:17.183 回答