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