想象你走进一个热闹的宴会厅。几百位宾客三五成群,有的围在甜品台旁,有的聚在爵士乐队前,还有的在窗边聊得正欢。作为这场宴会的主人,你手里只有一本厚厚的宾客名册——上面写着每个人的姓名、职业和座位号。你想推荐新朋友互相认识,但名册只告诉你“谁坐在哪”,却完全看不出“谁和谁聊得来”。 现在换个思路:你不再盯着名册,而是站在高处俯瞰整个大厅。你看到 A 和 B 正端着酒杯大笑,C 刚从 D 的圈子挪到 E 的圈子,F 虽然站在角落,但他左手边的甜点和 G 喜欢的完全一样。你瞬间就明白了——原来推荐朋友,不是比对他们的档案,而是看清他们之间那一道道看得见、摸得着的关系线。 这正是图数据库在推荐系统里扮演的角色。传统数据库像是那本名册,把信息塞进一行行表格;而图数据库像一张蜘蛛网,把用户、物品、标签当作一个个“点”,把他们的互动、购买、喜欢当作一条条“线”。推荐系统顺着这些线爬行,一步、两步、三步,就能发现那些藏在表格深处、却近在咫尺的潜在兴趣。这套思路,就是这场技术宴会里最优雅的社交智慧。

岗位关联

学这个能带来什么:掌握图数据库的推荐建模思路,你就能在电商、社交、内容平台等场景中设计出能解释、能扩展、能抗冷启动的推荐系统——这是算法工程师和大数据架构师的核心竞争力之一。

目录
  1. 可视化演示
  2. 关系建模
  3. 多跳查询
  4. 图游走推荐
  5. 冷启动解法
  6. 混合推荐
  7. 工程化落地
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示用户-物品-标签图建模、协同过滤图遍历推荐、多跳路径发现潜在兴趣及GNN图神经网络消息传递与嵌入学习机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

图数据库推荐系统 图建模:用户-物品-标签多维关系网络 协同过滤:图遍历实现UserCF/ItemCF推荐 多跳遍历:免索引邻接高效发现潜在兴趣 GNN融合:消息传递学习节点嵌入表示 图数据库以关系查询效率优势支撑复杂推荐场景

关系建模

宴会厅里,主人若要搞清楚谁和谁认识,光靠名册是不够的。他需要一张真正的社交关系图:每个人是一个圆点,每段关系是一条连线。A 和 B 握手,就连一条线;C 给 D 递过名片,也连一条线。图数据库的建模,做的正是这件事——把现实世界里的“实体”和“联系”原封不动地搬进数据库。

在推荐系统里,最常见的实体(节点)是用户和物品。用户是那个站在宴会厅里的人,物品是桌上的菜品、墙上的画、音箱里播的歌。而“边”则是他们之间发生过的互动:用户点击过物品、购买过物品、收藏过物品,或者用户之间互相关注。每一条边还可以带着属性,比如“点击了 5 次”“打分 4.5 星”——这就像在连线上贴了一张便利贴,写着这段关系的细节。

此外还有一类特殊的节点:标签。标签像是宴会厅里的分类牌——“素食”“爵士乐”“悬疑小说”。一个物品挂上“素食”标签,就和所有喜欢素食的宾客产生了看不见的连接。在图中,属性与标签可以挂在节点或边上,它们让推荐系统不只是知道“你和某人都买过这本书”,还能进一步知道“你们为什么都买它”。

回到宴会厅:你手里的那张蜘蛛网就是图,圆点是宾客、菜品和分类牌,连线是他们之间的互动。有了这张网,你不用再翻名册挨个对比档案,一眼就能看出谁和谁是一个圈子的。这就是关系建模的魔力——它把推荐问题从“查表格”变成了“看关系”。

G=(V,E)V=U∪I∪TE⊆(U×I)∪(U×U)∪(I×T)G = (V, E) \quad V = U \cup I \cup T \quad E \subseteq (U \times I) \cup (U \times U) \cup (I \times T)
图 G 由节点集合 V 和边集合 E 构成。V 包含用户 U、物品 I、标签 T 三类节点;E 则定义了用户与物品、用户与用户、物品与标签之间的三类关系。有了这个骨架,推荐就有路可走。
  1. 图的基本构成推荐系统把整个业务场景抽象成一张有向图,其中节点是实体,边是关系。
    G=(V,E)G = (V, E)
  2. 三类节点节点集合 V 是用户集合 U、物品集合 I、标签集合 T 的并集。
    V=U∪I∪TV = U \cup I \cup T
  3. 三类关系边集合 E 中包含了用户对物品的互动、用户之间的社交关系、物品对标签的归属关系。
    E⊆(U×I)∪(U×U)∪(I×T)E \subseteq (U \times I) \cup (U \times U) \cup (I \times T)

多跳查询

站在宴会厅高处,你不仅能看到直接关系,还能顺着关系链往下看:你认识 A,A 认识 B,B 今天戴了一条和你同款的领带。你不需要认识 B,也能猜到他品味不错。图数据库的多跳查询,做的就是“顺着关系链跨步走”。

在 SQL 风格的表格数据库里,你要找“朋友的朋友买过的东西”,得一遍遍 JOIN 自己。而图数据库天生支持这种查询:从用户节点出发,沿着“关注”边跳到朋友节点,再沿“购买”边跳到物品节点。每一步是一跳(hop),走三步就能回答“朋友的朋友买了什么”。Neo4j 的 Cypher 查询语言里,这个操作叫可变长度路径匹配。

多跳查询的核心价值在于发现“间接兴趣”。你喜欢的不是朋友买的那本书,而是“朋友这个人的品味”——而品味是通过一层层关系传递的。每多跳一步,兴趣信号就衰减一分,但同时也拓宽一分。BFS(广度优先搜索)保证了在有限步数内,所有可达的候选物品都能被找出来,不会因为路径曲折而漏掉。

宴会厅里的你,顺着“认识的熟人”这根线,一步步往外探。每多问一个人,你得到的消息就越间接,但也越可能超出你原本的小圈子。多跳查询让推荐系统既有了深度(能找到隐藏兴趣),也有了广度和可解释性(每条推荐都能说清来路)。

Score(u,i)=∑p∈Paths(u,i,k)w(p)Paths(u,i,k)={长度≤k 的 u→i 路径}\text{Score}(u, i) = \sum_{p \in \text{Paths}(u, i, k)} w(p) \quad \text{Paths}(u, i, k) = \{ \text{长度} \leq k \text{ 的 } u \to i \text{ 路径} \}
用户 u 对物品 i 的兴趣分数,等于所有从 u 到 i 且长度不超过 k 的路径的权重之和。路径越长,权重通常越低——就像传言传得越远越不可靠。
  1. 兴趣打分给用户 u 和物品 i 之间的候选关系打分,分数越高越值得推荐。
    Score(u,i)=∑p∈Paths(u,i,k)w(p)\text{Score}(u, i) = \sum_{p \in \text{Paths}(u, i, k)} w(p)
  2. 路径集合Paths 函数找出所有从 u 出发、在 k 跳以内能到达 i 的路径。
    Paths(u,i,k)={长度≤k 的 u→i 路径}\text{Paths}(u, i, k) = \{ \text{长度} \leq k \text{ 的 } u \to i \text{ 路径} \}
  3. 权重配置每条路径权重 w(p) 可配置——跳数多则权重小,关系类型不同也可设不同权重。

图游走推荐

如果整张宴会厅的关系网有上亿个节点,你不可能一条条去看所有路径——那会看到宴会结束都看不完。聪明的做法是:不数完每一条路,而是像随机散步一样,在这里停一停,那里拐个弯,走很多很多次,看看自己最后总停留在哪些人身边。这就是随机游走(Random Walk)的思路。

在图上做推荐时,我们从一个目标用户节点出发,每次随机选择一条边走到下一个节点。走固定步数后停下来,记录终点节点。重复成千上万次,被“走”到的频次最高的物品节点,就是推荐候选。这个思路的学术版本叫 DeepWalk——它把随机游走产生的节点序列当作“句子”,用类似 Word2Vec 的方法把节点变成向量,于是“相似的用户”和“相似的物品”在向量空间里自然聚在一起。

随机游走最大的好处是计算可行且效果好。它不需要枚举所有路径,只需采样一部分就能稳定逼近真实的路径分布。节点相似度也有了新定义:在随机游走中经常同时出现的节点,就是相似的。

你在宴会厅里散步,每次转弯都随机选一个方向。走的次数多了,你发现自己总在音乐区附近打转——因为那附近的“路”特别多。图游走推荐也是如此:真实世界里,物以类聚的规律会让相似的节点之间“路更多”,游走者自然会频繁光顾,于是推荐就诞生了。

P(vj∣vi)=wij∑k∈N(i)wikNode2Vec: f(vi)∈RdP(v_j \mid v_i) = \frac{w_{ij}}{\sum_{k \in N(i)} w_{ik}} \quad \text{Node2Vec: } f(v_i) \in \mathbb{R}^d
从节点 vᵢ 走到邻居 vⱼ 的概率,等于这条边的权重除以 vᵢ 所有出边权重之和。多轮游走之后,每个节点都被映射成一个 d 维向量,向量的距离就是节点间的相似度。
  1. 转移概率P(vⱼ|vᵢ) 表示当前在 vᵢ 时,下一步走到 vⱼ 的概率,由边权 wᵢⱼ 决定。
    P(vj∣vi)=wij∑k∈N(i)wikP(v_j \mid v_i) = \frac{w_{ij}}{\sum_{k \in N(i)} w_{ik}}
  2. 邻居加权分母是 vᵢ 所有邻居边权之和,保证概率归一化。
    ∑k∈N(i)wik\sum_{k \in N(i)} w_{ik}
  3. 节点向量化Node2Vec 将游走序列送入神经网络,为每个节点学习一个 d 维稠密向量。
    f(vi)∈Rdf(v_i) \in \mathbb{R}^d

冷启动解法

新来的宾客站在门口,谁也不认识,名册上只有他的名字。作为主人,你怎么给他推荐朋友?这就是推荐系统里最头疼的“冷启动”问题——没有历史行为数据,协同过滤无从下手。但图数据库提供了一盏指路明灯:即使新用户没买过东西,只要他关注了几个老用户,或者给某件商品点了赞,他就不再是“孤岛”了。

在新用户场景下,他与老用户之间的“关注”边,就是他的社交身份证。老用户喜欢什么,可以作为新用户兴趣的初始估计。比如 Instagram 的新用户注册后会让你选择感兴趣的话题账号——你选了哪些账号,图数据库就把你连到了那些账号所在的社区。在新物品场景下,一件刚上架的商品没有销量,但如果它被打上了“咖啡”标签,而你的图里已经有大量和“咖啡”相关的用户行为,这瓶新咖啡豆就能立刻通过标签桥接到感兴趣的顾客面前。

标签在这里是破冰的船,社交关系是引路的灯。相比纯粹依赖行为数据的传统协同过滤,图结构让推荐系统在数据稀疏时依然有信号可用——这就像宴会厅里,即使新客人沉默寡言,他站在哪扇窗边、衣着什么风格,也在悄悄透露他的偏好。

宴会厅里那位新客人,只要他开口提了一句“我喜欢拉花咖啡”,主人就能顺着这条线索,把他领到角落那位正展示拉花手艺的咖啡师面前。冷启动的解药,不是等待更多数据,而是把身边已有的关系网络、标签线索充分调动起来。

r^ui=α⋅Simsocial(u,Useed)+β⋅Simtag(i,Tseed)\hat{r}_{ui} = \alpha \cdot \text{Sim}_{\text{social}}(u, U_{\text{seed}}) + \beta \cdot \text{Sim}_{\text{tag}}(i, T_{\text{seed}})
新用户 u 对物品 i 的预测评分,由两部分加权合成:一是 u 与种子用户群的社交相似度,二是 i 与用户已知兴趣标签的匹配度。α 和 β 调节两部分的权重。
  1. 社交信号Sim_social 计算新用户 u 和已有关注关系网络中的种子用户群的相似度。
    Simsocial(u,Useed)\text{Sim}_{\text{social}}(u, U_{\text{seed}})
  2. 标签信号Sim_tag 计算物品 i 的标签与种子兴趣标签集合的匹配得分。
    Simtag(i,Tseed)\text{Sim}_{\text{tag}}(i, T_{\text{seed}})
  3. 加权融合系数 α、β 控制两种信号的比例,冷启动阶段通常调大社交信号的权重。
    α⋅Simsocial+β⋅Simtag\alpha \cdot \text{Sim}_{\text{social}} + \beta \cdot \text{Sim}_{\text{tag}}

混合推荐

宴会进行到一半,主人发现单靠“大家都在聊什么”推荐效果不错,但总漏掉一些安静却独特的角落。他意识到:社交观察(协同过滤)和兴趣标签(内容特征)各有盲区,只有把两者结合起来,才真正摸透每位宾客的胃口。推荐系统也一样,图数据库不是要替代协同过滤和内容推荐,而是做它们的中枢。

混合推荐的第一种做法是“图中融合”:把协同过滤的“用户-物品”行为矩阵、内容推荐的“物品-标签”特征,全部建模进同一张图里。于是图查询天然就同时利用了两类信号。第二种做法是“多路召回,统一排序”:用户向量嵌入(来自图游走)、协同过滤候选、内容推荐候选各自生成推荐列表,再用一个排序模型(比如 LambdaRank)将它们融合打分。

为什么图数据库能当这个“融合器”?因为图和表格不同,不要求数据格式统一。用户-用户社交边、用户-物品行为边、物品-标签属性边,格式不同却都自然共存于一张图。多路召回保证了覆盖面,排序模型保证了精确度。

聪明的宴会主人从来不会只听一种声音。他会关注谁和谁聊得热闹(协同过滤),也会记住客人入场时登记的偏好(内容特征),还会观察客人站在哪个区域的时间最久(图结构)。三份情报一叠加,推荐自然准得多。

FinalScore(u,i)=γ1⋅CF(u,i)+γ2⋅CB(u,i)+γ3⋅GraphSIM(u,i)\text{FinalScore}(u, i) = \gamma_1 \cdot \text{CF}(u, i) + \gamma_2 \cdot \text{CB}(u, i) + \gamma_3 \cdot \text{GraphSIM}(u, i)
最终推荐分数是协同过滤、内容过滤、图结构相似度三路得分的加权和。权重可以用离线实验或在线 A/B 测试来调优。
  1. 协同过滤信号CF(u,i) 基于用户行为矩阵计算 u 对 i 的偏好。
    CF(u,i)\text{CF}(u, i)
  2. 内容特征信号CB(u,i) 基于物品自身的文本、标签、类目等特征计算匹配度。
    CB(u,i)\text{CB}(u, i)
  3. 图结构信号GraphSIM(u,i) 基于图游走、公共邻居、路径数量等计算节点相似度。
    GraphSIM(u,i)\text{GraphSIM}(u, i)
  4. 加权求和γ₁、γ₂、γ₃ 是三个信号的权重,实际中可根据场景调节侧重。
    γ1+γ2+γ3=1\gamma_1 + \gamma_2 + \gamma_3 = 1

工程化落地

理论说得再好,宴会真办起来,总有现实的麻烦:一千人的大厅,你怎么保证每位客人进门时都能快速找到想见的人?图数据库的工程化落地,同样要面对存储选型、性能调优、实时更新这三道坎。

存储选型上,Neo4j、JanusGraph、NebulaGraph 各有擅长。Neo4j 功能全、生态成熟,适合中小规模业务;JanusGraph 底层依赖 HBase/Cassandra,适合分布式海量图;NebulaGraph 是国产分布式图数据库,性能强劲。选型的关键看数据规模、查询模式和团队运维能力。

查询性能上,图数据库的索引策略和缓存设计至关重要。节点属性要建索引,常用路径要缓存,深链查询要设置最大跳数限制。真实环境里,一个 6 跳以上的查询可能让数据库卡顿,而推荐系统最常用的其实只是 2 到 3 跳。实时更新上,流式写入(比如通过 Kafka 接入用户行为)能保证图数据与业务同步;批量离线更新则适合生成节点向量和全局统计特征。

宴会的成功,既要有邀请名单上的精心策划,也要有现场动线的流畅设计。哪道菜放在哪个位置、引导员站在哪个路口,都是工程细节。图数据库落地的本质,就是把图这个“万能的社交模型”,端到端地安放进工业级的系统里,让它快、稳、准地服务每一位用户。

Qlatency=Tindex lookup+∑h=1k(Tneighbor scan+Tfilter)Q_{latency} = T_{\text{index lookup}} + \sum_{h=1}^{k} (T_{\text{neighbor scan}} + T_{\text{filter}})
图查询延迟等于初始索引查找时间,加上每一跳的邻居扫描和条件过滤的时间之和。跳数 k 是延迟的最大变量。
  1. 入口查找T_index lookup 是通过索引定位起始节点的时间。
    Tindex lookupT_{\text{index lookup}}
  2. 逐跳扫描每一跳查询都要扫描当前节点的邻居,然后按条件过滤。
    ∑h=1k(Tneighbor scan+Tfilter)\sum_{h=1}^{k} (T_{\text{neighbor scan}} + T_{\text{filter}})
  3. 延迟与跳数总延迟随跳数 k 线性增长,因此控制跳数就是控制性能。
    Qlatency=Tindex lookup+∑h=1k(⋯ )Q_{latency} = T_{\text{index lookup}} + \sum_{h=1}^{k} (\cdots)

AI 应用场景

电商平台“猜你喜欢”

阶段:召回与排序

解决的问题:传统协同过滤面对新用户无行为数据时束手无策;基于图的多跳推荐可以通过用户的社交关系(关注店铺、分享好友)和商品标签(类目、风格)实现冷启动召回。

具体案例:某电商平台接入图数据库后,将用户、商品、店铺、品牌、类目构建为异构图。当一位新用户搜索“露营”并浏览了两个户外品牌后,系统通过 2 跳路径即可推荐其好友收藏的帐篷,以及“露营”类目下在户外社群中流行的灯具。

社交平台的“你可能认识的人”

阶段:候选生成

解决的问题:传统 SQL 查找二度好友需要多次 JOIN 且性能低下,图数据库一条 Cypher 查询即可完成多跳节点发现,并输出共同好友数、共同兴趣群组数作为排序特征。

具体案例:LinkedIn 的"People You May Know"系统早期就曾基于图数据库,通过二度连接(朋友的朋友)和三度连接生成推荐,再用共同好友数等图特征排序,显著提升了加好友转化率。

音乐与视频流媒体的“发现页”

阶段:多路召回融合

解决的问题:歌单、视频标签、用户收藏、创作者关注关系分散在不同系统中;图数据库将它们统一建模,让“喜欢歌手 A 的用户也喜欢歌手 B”与“B 的新歌带标签 X 且你常听 X”两类信号同时参与计算。

具体案例:某音乐 App 用图数据库构建用户-歌曲-歌手-歌单-标签的五类节点图,用随机游走生成候选歌曲向量,与协同过滤候选合成后,在排序阶段引入“路径长度作为新颖度特征”,在保持准确率的同时将推荐多样性提升了 8%。

Python 演示

python41 行
import networkx as nx # 1. 构建异构图g = nx.Graph()g.add_node("U1", type="user")g.add_node("U2", type="user")g.add_node("P1", type="item")g.add_node("P2", type="item")g.add_node("T1", type="tag") # 2. 添加关系边g.add_edge("U1", "U2", relation="follow")g.add_edge("U2", "P1", relation="buy")g.add_edge("P1", "T1", relation="tagged")g.add_edge("T1", "P2", relation="related") # 3. 多跳路径发现:从 U1 出发,3 跳内可达的所有节点target_user = "U1"max_hops = 3candidates = set() for path in nx.all_simple_paths(g, source=target_user, cutoff=max_hops):    last_node = path[-1]    if g.nodes[last_node]["type"] == "item" and last_node not in candidates:        candidates.add(last_node)        print(f"发现候选物品: {last_node}, 路径: {' -> '.join(path)}") # 4. 基于公共邻居的相似度打分def recommend_by_common_neighbors(g, user, top_k=3):    scores = {}    for item in g.nodes():        if g.nodes[item]["type"] != "item":            continue        if item in g.neighbors(user):            continue        common = len(set(g.neighbors(user)) & set(g.neighbors(item)))        if common > 0:            scores[item] = common    return sorted(scores.items(), key=lambda x: x[1], reverse=True)[:top_k] print("公共邻居推荐结果:", recommend_by_common_neighbors(g, target_user))
目的:用 NetworkX 搭建一张含有用户、物品、标签三类节点的微型图谱,演示多跳路径发现和基于公共邻居的图推荐。
  1. g = nx.Graph()初始化一张无向图,节点和边都可以带类型信息。
  2. g.add_edge("U1", "U2", relation="follow")给边加上关系类型,图推荐中边类型会影响路径权重。
  3. nx.all_simple_paths(g, source=target_user, cutoff=max_hops)核心 API,枚举从目标用户出发不超过 max_hops 跳的所有简单路径。
  4. if g.nodes[last_node]["type"] == "item"只保留路径终点是物品的候选,筛掉中间节点。
  5. len(set(g.neighbors(user)) & set(g.neighbors(item)))计算用户和物品的公共邻居数,作为最简单的图相似度打分。

常见误区

误区很多初学者以为图数据库只是把 SQL 表换成了图的可视化展示,性能比 MySQL 快,所以用来做推荐。

正解图数据库不是“更快的 MySQL”,而是“不同的数据模型”。它对多跳关系查询的优化是结构性的——关系型数据库做 3 次 JOIN 就开始吃力,图数据库因为数据存储本身就包含指针,所以沿着边遍历是天然操作。但图数据库在简单的等值查询和聚合统计上反而不如关系型数据库。选型看查询模式,而不是性能排行。

为何常见:因为大家习惯了“新的比旧的快”的技术叙事,而且图数据库通常配有漂亮的可视化界面,容易产生“很高科技”的错觉。

误区认为“图上模型 = 高级 = 更好”,于是把协同过滤换成图算法,期待准确率大幅提升。

正解图推荐最适合的是数据稀疏、关系丰富、需要解释性的场景。在数据密集的电商场景,成熟的协同过滤和深度模型往往效果更好。图的价值在于“补充”而非“替代”——它提供了一条整合多源关系的通路,让冷启动和多样性的问题有了新解法。实际工程常用多路融合,图是其中重要的一路,不是全部。

为何常见:技术文章喜欢讲图数据库的优越案例,很少提它“不擅长什么”,导致初学者产生“图推荐万能”的错觉。

误区认为既然多跳能发现潜在兴趣,那就把跳数设大一点,比如 10 跳,把所有间接关系都收入囊中。

正解兴趣信号在传播中会衰减。朋友的朋友买了什么有参考价值,但“朋友的朋友的朋友的熟人买了什么”基本就是噪音。跳数过大不仅大幅拖慢查询速度,更重要的是引入大量无关推荐,让结果变得莫名其妙。工业实践中 2-3 跳是黄金范围,跳数越大权重越低,超过 5 跳直接截断。

为何常见:初学者只看到“多跳发现了隐藏兴趣”这个好处,却忽略了“兴趣传导会衰减”这个物理事实。

误区把图数据库当作“越大越好,查得越快”,认为只要上了图数据库,所有多跳查询都能毫秒级返回。

正解真实场景中,过深的路径查询在超大规模图上仍然很慢。工业系统通常不直接对在线查询做深层图遍历,而是离线预计算:用 Spark 等框架定期计算高阶路径信息并物化,在线服务只查 1-2 跳的浅层关系或直接命中预计算结果。实时与深度不可兼得,架构上要分层取舍。

为何常见:厂商宣传视频里演示的都是几十个节点的玩具图,真实生产环境是百亿节点,复杂度完全不是一个量级。

面试题

Q1. 图数据库相比关系型数据库,在推荐系统中最核心的优势是什么?

单选题 · mid

  • A.存储空间更小,节省服务器成本
  • B.多跳关系查询的性能和表达能力更强← 正确答案
  • C.不需要建索引,写入速度更快
  • D.支持 SQL 标准,迁移成本为零

答案:B。图数据库按“边”存储邻居关系,遍历多跳关系时不需要多次 JOIN 和索引查找,表达“朋友的朋友买了什么”这类问题时天然高效。A、C 不是图数据库特点,D 与事实相反——图数据库通常用 Cypher 等专用查询语言。

Q2. 以下哪些是图数据库在推荐系统中适用的典型场景?

多选题 · mid

  • A.冷启动:新用户没有任何行为数据,但有社交关系← 正确答案
  • B.需要解释推荐理由:推荐结果可以回溯到具体的图路径← 正确答案
  • C.对海量用户做简单的 1 跳统计聚合
  • D.新物品挂上标签后,通过标签桥接已有用户兴趣← 正确答案

答案:ABD。社交关系、路径解释、标签桥接都是图结构的核心优势。C 错误,简单的统计聚合用关系型数据库或列式存储更合适,图数据库在这类场景上没有优势。

Q3. 在用户-物品-标签异构图建模中,节点和边分别代表什么?

单选题 · easy

  • A.节点是用户,边是物品
  • B.节点是实体,边是实体间的关系← 正确答案
  • C.节点是物品,边是标签
  • D.节点是属性,边是主键

答案:B。图建模中节点(Vertex)代表实体——用户、物品、标签,边(Edge)代表关系——关注、购买、标记。B 是图模型的标准定义。ACD 都是对概念的错误理解。

Q4. 随机游走在图推荐中的主要作用是什么?

单选题 · mid

  • A.让推荐结果随机化,增加惊喜感
  • B.通过采样逼近节点间的真实相似分布← 正确答案
  • C.减少图中节点的数量,简化计算
  • D.替代排序模型做最终的点击率预估

答案:B。随机游走通过在图上反复采样,统计节点被共同访问的频率,从而估计节点相似度。它是 DeepWalk、Node2Vec 等图嵌入方法的基础。A 是误解,B 是核心目的,C 错误——游走不删节点,D 错误——游走属于召回阶段,不做精排。

Q5. 新物品冷启动推荐的关键策略有哪些?

多选题 · mid

  • A.等待用户行为积累足够再推荐
  • B.用物品的标签和内容特征桥接用户兴趣← 正确答案
  • C.将新物品关联到相似的已有物品← 正确答案
  • D.直接随机推送给所有用户

答案:BC。新物品没有行为数据,但标签、图片、文本等内容特征可以匹配用户已有兴趣。同时也可以通过图结构将新物品关联到相似的热门物品间接推荐。A 是被动等待,不是策略,D 是低质量的策略。

Q6. 图数据库中“多跳查询”的时间复杂度主要取决于什么?

单选题 · easy

  • A.图的节点总数
  • B.查询的跳数和每跳平均邻居数← 正确答案
  • C.数据库服务器 CPU 主频
  • D.图可视化窗口的大小

答案:B。多跳查询每跳都要扫描当前节点的邻居,所以复杂度近似 O(邻居数^跳数)。它与图的整体规模关系不大,而与“局部密度”和“跳数”强相关。这解释了为什么要控制跳数、对高密度区域做剪枝。

Q7. 在混合推荐中使用图数据库的核心价值是什么?

单选题 · hard

  • A.完全替代协同过滤模型
  • B.统一多种关系数据,提供可解释的桥梁特征← 正确答案
  • C.让推荐结果永远不重复
  • D.消除对用户行为日志的依赖

答案:B。图数据库的核心价值在于把用户-用户社交关系、用户-物品行为、物品-标签内容特征统一存储在同一张图里,让不同信号通过路径相互连接,产生“协同+内容”的涌现特征。A 错误,图不是替代;D 错误,图仍然需要行为数据来构建边。

Q8. 以下哪些图结构特征可用于推荐排序阶段的实际特征?

多选题 · hard

  • A.两个节点间最短路径的长度← 正确答案
  • B.公共邻居的数量← 正确答案
  • C.节点在社区中的紧密中心度← 正确答案
  • D.边的颜色值

答案:ABC。最短路径长度反映关系的紧密程度(越短越相关),公共邻居数量是协同过滤的图化表达,紧密中心度刻画节点在图中的影响力——这些都可作为排序特征。D 颜色是可视化属性,不是推荐特征。

Q9. 图数据库中“路径即解释”的含义是什么?

单选题 · easy

  • A.每条 SQL 查询语句都有日志记录
  • B.推荐结果可以回溯到一条具体的节点关系链,向用户展示推荐理由← 正确答案
  • C.数据库的所有操作都要记录路径日志
  • D.图查询语句需要编写详细的注释

答案:B。图的路径天然携带语义信息——“你关注的好友购买了这件商品”,这条路径就是推荐理由。这是图推荐相比深度模型的独特优势:可解释性。A、C、D 都是对“解释”一词的误读。

Q10. 工业级图推荐系统中,为什么通常不直接对在线请求做深度图遍历?

单选题 · hard

  • A.图数据库不支持超过 3 跳的查询
  • B.深度遍历在超大图上延迟高,超出线上服务要求← 正确答案
  • C.深度遍历结果一定是无效的
  • D.图数据库会拒绝所有含环的查询

答案:B。百亿节点规模的图上,深度遍历会访问指数级的邻居节点,毫秒级线上接口无法承受。工业方案通常离线批量计算多跳特征并物化,在线阶段只做 1-2 跳查询或直接读取预计算结果。A 错误——图数据库技术上支持深跳,只是性能不可接受;C、D 是错误说法。