更新2:
最初的问题太长了,很简单:
在The City Graph中,如何查询germanHighway
可以直接从柏林到达的城市。我不要internationalHighway
。
原始问题:
我现在使用ArangoDB来存储图形。我对数据模型设计有一个疑问。
例如,使用Knows_graph social_graph
在我最初的选择中,我认为我将设计两个集合,Document集合为person
,Edge集合为marriedWith
或friendWith
。
但是当我要查询marriedWith
某人的人时,我无法过滤掉多余的friendWith
边缘。(我对AQL不太熟悉,也许这不是真的)
与AQL文档中的示例相反,它用于定义更常见的边缘集合,例如relation
中的social_graph
,并在属性中定义更具体的类型。例如"type":"married"
作为relation
的属性。
因此,在AQL中,我可以使用FILTER p.edges[0].type== 'married'
过滤不想要的关系。
我的问题是:
哪种数据模型设计方法更好,或者对此有何建议?
现在,我认为,将married
当作人的一种,可能会更灵活,更容易扩展到student
并带有一个neighbour
Edge集合。
否则,应创建许多Edge集合relation
,isStudent
...。
AQL是否可以按边缘类型而不是属性过滤节点?也许看起来像:
neighbourWith
更新:
我刚刚尝试过,一种关系只能用于两种节点类型。
例如,一个FILTER 'isStudent' edge
边用于isFriend
和person
节点,那么您不能将dog
边用于isFriend
和{{ 1}}!
必须有很多边缘。
答案 0 :(得分:0)
我认为设计数据模型的方法取决于您的业务,如果您的模型或多或少是稳定的,并且没有很多边缘,则可以选择many edges
的方法,即边缘是有限集。
但我不知道如何按边缘名称过滤:-)
否则,我认为较少的边缘和更多的属性将是好的。
答案 1 :(得分:0)
对于原始问题:
如果您有数量有限且定义明确的边,那么如果希望每种类型的边都很多,则使用多个边集合特别好。另一方面,如果您预见到必须拥有大量的关系类型(朋友,最好的朋友,妻子等)并且每种类型的关系数量都不是很大,那么带有类型指示器的单个边缘集合就可以了,并且可以简化事情。
我想到的从遍历中过滤边缘的唯一两种方法是:
在每个边缘集合中添加一个type属性,以指示这是什么集合类型。是的,它基本上是一个静态场,有点浪费空间,但是它现在可以工作并且空间很便宜
使用匿名图形遍历,您可以在其中定义要明确使用的边
话虽这么说,Arango是一个多模型数据库,因此您可以忽略遍历语法,而只需联接所需的表,这同样可以正常工作。多模型数据库非常棒,您可以根据需要使用它们。
对于上一次更新,您可以执行以下操作来检查边缘集合:
FILTER IS_SAME_COLLECTION('internationalHighway', e._id) == false