关于arangodb中的数据模型设计的问题

时间:2019-04-20 08:57:13

标签: arangodb aql

更新2:

最初的问题太长了,很简单:

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

原始问题:

我现在使用ArangoDB来存储图形。我对数据模型设计有一个疑问。

例如,使用Knows_graph social_graph

在我最初的选择中,我认为我将设计两个集合,Document集合为person,Edge集合为marriedWithfriendWith

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

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

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

我的问题是:

  1. 哪种数据模型设计方法更好,或者对此有何建议?
    现在,我认为,将married当作人的一种,可能会更灵活,更容易扩展到student并带有一个neighbour Edge集合。

    否则,应创建许多Edge集合relationisStudent...。

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

    neighbourWith

更新

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

例如,一个FILTER 'isStudent' edge边用于isFriendperson节点,那么您不能将dog边用于isFriend和{{ 1}}!

必须有很多边缘。

2 个答案:

答案 0 :(得分:0)

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

否则,我认为较少的边缘和更多的属性将是好的。

答案 1 :(得分:0)

对于原始问题:

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

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

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

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

话虽这么说,Arango是一个多模型数据库,因此您可以忽略遍历语法,而只需联接所需的表,这同样可以正常工作。多模型数据库非常棒,您可以根据需要使用它们。

对于上一次更新,您可以执行以下操作来检查边缘集合:

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