优化 Spanner 图查询的最佳实践

本文档介绍了调整 Spanner 图查询的最佳实践 其中包括以下优化措施:

  • 避免全面扫描输入表中的节点和边。
  • 减少查询需要从存储空间读取的数据量。
  • 缩减中间数据的大小。

从基数较低的节点开始

编写路径遍历,使其从基数较低的节点开始。 这种方法使中间结果集保持较小,并加快查询速度 执行。

例如,以下查询具有相同的语义:

  • 正向边缘遍历:

    GRAPH FinGraph
    MATCH (p:Person)-[:Owns]->(a:Account)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    
  • 反向边缘遍历:

    GRAPH FinGraph
    MATCH (a:Account)<-[:Owns]-(p:Person)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    

假设名为“Alex”的人少于 我们建议您将查询内容 边缘遍历

对于可变长度路径遍历,从基数较低的节点开始尤为重要。以下示例展示了 以查找 三个跃点

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

默认指定所有标签

如果省略标签,Spanner Graph 会推断出符合条件的节点和边标签。我们建议您为所有节点和边缘指定标签 因为这种推断未必总能实现, 会导致扫描的标签过多。

单个 MATCH 语句

以下示例会查找由最多 3 个转移关联且 指定账号:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

在 MATCH 语句上

在节点和边缘上指定标签(当节点和边引用同一个元素时, 跨 MATCH 语句。

以下示例展示了此推荐方法:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

后续步骤