如何在ArangoDB图中查询关联多节点的节点:找关联3个景点的酒店
解决ArangoDB查询关联3个及以上景点的酒店问题
我来帮你搞定这个查询需求!你现在需要找出关联了至少3个不同Attractions节点的Hotels,而当前的查询只是把关联了至少一个景点的酒店都列出来了,还没法筛选数量,对吧?
先分析下你当前查询的问题
你原来的语句是遍历每个景点,然后向外找1-2跳的节点,但这样会把每个酒店和景点的关联关系重复返回,而且没有统计每个酒店关联的景点总数,自然没法筛选出关联3个及以上的结果。
给你两种可行的查询方案
方案1:从酒店出发,统计关联的景点数量
这种方式先遍历所有酒店,再查询每个酒店关联的景点,最后筛选数量达标:
FOR hotel IN Hotels // 子查询:找出当前酒店关联的所有景点(注意边的方向,这里假设边是从Attraction指向Hotel,所以用INBOUND;如果反过来就改成OUTBOUND) LET connected_attractions = ( FOR v, e, p IN 1..1 INBOUND hotel GRAPH "LondonAttractionDB" FILTER v.entityTypes[0] == "Attraction" RETURN v._key // 返回景点的唯一标识,避免重复计数 ) // 筛选关联景点数≥3的酒店 FILTER LENGTH(connected_attractions) >= 3 // 返回结果,包含酒店信息、关联景点数和具体景点列表 RETURN { hotel_info: hotel, associated_attraction_count: LENGTH(connected_attractions), associated_attractions: connected_attractions }
方案2:从景点出发,分组统计酒店关联数
这种方式从景点入手,把关联的酒店分组,统计每个酒店被多少个景点关联:
FOR attraction IN Attractions // 找出当前景点关联的所有酒店(边方向同样根据你的图结构调整) FOR hotel IN 1..1 OUTBOUND attraction GRAPH "LondonAttractionDB" FILTER hotel.entityTypes[0] == "Hotel" // 按酒店分组,统计关联的景点数量 COLLECT hotel_key = hotel._key, hotel_details = hotel WITH COUNT INTO attraction_count // 筛选关联数≥3的酒店 FILTER attraction_count >= 3 RETURN { hotel_info: hotel_details, associated_attraction_count: attraction_count }
关键注意点
- 边的方向:一定要根据你图中实际的边关系调整
INBOUND/OUTBOUND。比如如果你的边是Hotel -> Attraction(酒店关联景点),那方案1里就要改成OUTBOUND hotel去查景点;如果是Attraction -> Hotel(景点关联酒店),就用INBOUND hotel。 - 去重计数:方案1里返回
v._key是为了确保即使同一个景点通过多条边关联到酒店,也只会被计数一次;方案2的COLLECT本身会自动去重,因为是按酒店的唯一_key分组的。
内容的提问来源于stack exchange,提问作者Fleur
相关产品推荐
相关产品推荐

