【问题标题】:question about data model design in arangodb关于 arangodb 中数据模型设计的问题
【发布时间】:2019-09-10 07:38:48
【问题描述】:

更新 2:

原题太长,一个简单的办法:

在The City Graph,如何查询germanHighway可以从柏林直接到达的城市。我不想要internationalHighway。

原问题:

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

以 know_graph 为例,social_graph

在我原来的选择中,我想我会设计两个集合,Document集合是person,Edge集合是marriedWith或friendWith。

但是当我想查询marriedWith某人的人时,我无法过滤不需要的friendWith边缘。(我对AQL不是很熟悉,也许这不是真的)。​​

与AQL Documents中的示例相比,它用于定义更常见的边缘集合,例如social_graph中的relation,并在属性中定义更具体的类型。例如,"type":"married" 作为relation 的属性。

因此在 AQL 中,我可以使用 FILTER p.edges[0].type== 'married' 过滤不需要的关系。

我的问题是:

  1. 哪种数据模型设计方法更好,或者对此有何建议?
    现在我想,把married作为一个人的类型,可能更灵活,很容易扩展到student,neighbour...用一个relation边缘集合。

    否则,应该创建许多 Edge 集合,isStudent、neighbourWith...。

  2. AQL 可以按边类型而不是属性过滤节点吗?也许看起来像:

    FILTER 'isStudent' edge

更新:

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

例如,person 和dog 节点使用一个isFriend 边,那么dog 和cat 不能使用isFriend 边!

必须需要这么多边。

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

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

    否则,我认为边缘越少,属性越多。

    【讨论】:

      【解决方案2】:

      对于原始问题:

      1. 如果您有一个有限且定义明确的边数,那么如果您希望每种类型都有大量边,则使用多个边集合非常合适。另一方面,如果您预见到必须有大量的关系类型(朋友、最好的朋友、妻子等)并且每种类型的关系数量并不多,那么带有类型指示符的单个边集合就可以了,并且可以简化事情。

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多