arangodb中的数据模型设计问题

arangodb中的数据模型设计问题,arangodb,aql,Arangodb,Aql,更新2: 原来的问题太长了,很简单: 在中,如何查询通过germanHighway直接从柏林到达的城市。我不想要国际高速公路 原始问题: 我现在使用ArangoDB存储一个图形。我有一个关于数据模型设计的问题 例如,使用knows_图 在我最初的观点中,我认为我将设计两个集合,文档集合是person,边缘集合是marriedWith或friendWith 但是,当我想查询与某人结婚的人时,我不能过滤那些不需要的有边缘的朋友(我对AQL不是很熟悉,也许这不是真的) 与AQL文档中的示例不同,它用于

更新2:

原来的问题太长了,很简单:

在中,如何查询通过
germanHighway
直接从柏林到达的城市。我不想要
国际高速公路

原始问题:

我现在使用ArangoDB存储一个图形。我有一个关于数据模型设计的问题

例如,使用knows_图

在我最初的观点中,我认为我将设计两个集合,文档集合是
person
,边缘集合是
marriedWith
friendWith

但是,当我想查询与某人结婚的人时,我不能过滤那些不需要的有边缘的朋友(我对AQL不是很熟悉,也许这不是真的)

与AQL文档中的示例不同,它用于定义更常见的边缘集合,例如,在
社会图
中定义
关系
,并在属性中定义更具体的类型。例如,
“type”:“已婚”
作为
关系的属性

因此,在AQL中,我可以使用
FILTER p.edges[0].type==“已婚”
来过滤不需要的关系

我的问题是:

  • 哪种数据模型设计方法更好,或者对此有何建议?
    现在我想,把
    已婚
    作为一种类型的人,可能会更灵活,容易扩展到
    学生
    邻居
    。。。具有一个
    关系
    边集合

    否则,许多边缘集合,
    isStudent
    neighbourWith
    。。。应该创造

  • AQL是否可以按边缘类型而不是属性筛选节点?也许看起来像:

    过滤“isStudent”边缘

  • 更新:

    我刚刚试过,一个关系只能用于两个节点类型

    例如,一个
    isFriend
    边缘用于
    person
    dog
    节点,那么您不能将
    isFriend
    边缘用于
    dog
    cat


    需要这么多的边

    我认为设计数据模型的方式取决于您的业务,如果您的模型或多或少是稳定的,并且没有很多边,您可以选择
    many edges
    方式,边是一个有限集。 但我不知道如何按边名称过滤:-)


    否则,我认为减少边缘和增加属性将是好的。

    对于原始问题:

  • 如果有有限的、定义良好的边,则使用多个边集合是很好的,特别是如果您希望每种类型都有大量的边。另一方面,如果您预见到需要大量的关系类型(朋友、最好的朋友、妻子等),并且每种类型的关系数量不是很大,那么带有类型指示符的单边集合就可以了,可以简化事情

  • 我能想到的从遍历中过滤边的唯一两种方法是:

    • 功能。这将告诉您文档是否属于特定类型。但是,如果在大型数据集中使用此功能,请注意性能
    • 在每个边集合中添加一个类型属性,该属性指示此集合的类型。是的,它基本上是一个静态场,有点浪费空间,但它可以工作,而且现在空间很便宜

    • 使用匿名图遍历,您可以在其中定义要显式使用的边

  • 话虽如此,Arango是一个多模型数据库,因此您可以忽略遍历语法,只需连接所需的表,这也可以很好地工作。多模型数据库的好处在于,您可以以任何需要的方式使用它们

    就上次更新而言,您可以通过执行以下操作来检查边缘集合:

    FILTER IS_SAME_COLLECTION('internationalHighway', e._id) == false