图形浏览基础知识

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于:✅ Azure 数据资源管理器

本文提供了可重用的 Kusto 查询语言 (KQL) 模式,用于快速浏览图形数据集并回答有关结构、节点、边缘和属性的常见问题。

小窍门

正在寻找设计和性能指南? 请参阅 图形语义的最佳做法。

常见分析查询

这些可重用的查询模式适用于所有图形模型,并帮助你了解任何图形数据集的结构和特征。 这些示例使用位于 Samples 数据库中的 help 群集 上的示例图。 有关这些图形的详细信息,请参阅 Graph 示例数据集和示例。 使用这些查询可以浏览新图形、执行基本分析或作为更复杂的图形调查的起点。

图形概述和统计信息

了解图形的基本特征对于分析规划和性能优化至关重要。 这些查询提供有关图形大小和结构的基本指标。

计算节点和边缘总数:

使用这些查询来了解图形数据集的规模。 节点和边缘计数有助于确定适当的查询策略,并确定潜在的性能注意事项。 这些示例使用 Simple 图,这是学习基本图操作的理想工具。

// Get node count
graph('Simple')
| graph-match (node)
    project node
| count
计数
11
// Get edge count
graph('Simple')
| graph-match (source)-[edge]->(target)
    project edge
| count
计数
20

获取图形摘要统计信息:

此组合查询有效地在单个结果中提供这两个指标,对于初始图形评估和报告非常有用。 此示例演示了使用 Simple 图形的技术。

let nodes = view() { graph('Simple') | graph-match (node) project node | count }; 
let edges = view() { graph('Simple') | graph-match (source)-[edge]->(target) project edge | count };
union withsource=['Graph element'] nodes, edges
图形元素 计数
nodes 11
边缘 20

使用图形到表的替代方法:

对于基本计数,graph-to-table 运算符可能更高效,因为它直接导出图元,而无需模式匹配的开销。 此示例演示了使用同一 Simple 图形的替代方法。

let nodes = view() { graph('Simple') | graph-to-table nodes | count };
let edges = view() { graph('Simple') | graph-to-table edges | count };
union nodes, edges
计数
11
20

节点分析

节点分析可帮助你了解图形中的实体、它们的类型和分布。 这些模式对于数据质量评估和架构理解至关重要。

发现所有节点类型(标签):

此查询显示图形中的不同实体类型及其频率。 使用它来了解数据模型,识别最常见的实体类型,并发现潜在的数据质量问题。 此示例使用Simple包含 Person、Company 和 City 实体的图形。

graph('Simple')
| graph-match (node) 
    project labels = labels(node)
| mv-expand label = labels to typeof(string)
| summarize count() by label
| order by count_ desc
标签 计数_
人员 5
公司 3
City 3

查找具有多个标签的节点:

标识同时属于多个类别的节点。 这对于了解数据模型中的重叠分类和复杂实体关系非常有用。 此示例使用图形BloodHound_Entra,其中包含具有多个标签分类的 Microsoft Entra 对象。

graph('BloodHound_Entra')
| graph-match (node) 
    project node_id = node.id, labels = labels(node), label_count = array_length(labels(node))
| where label_count > 1
| take 3
node_id labels 标签计数
2 [<br> "AZBase",<br> "AZServicePrincipal"<br>] 2
4 [<br> "AZBase",<br> "AZUser"<br>] 2
5 [<br> "AZBase",<br> "AZUser"<br>] 2

按类型排序的示例节点:

检索特定节点类型的代表性示例,以了解其结构和属性。 数据探索和查询开发至关重要。 此示例使用 BloodHound_Entra 图形 浏览 Microsoft Entra 环境中的 AZUser 节点属性。

graph('BloodHound_Entra')
| graph-match (node) 
    where labels(node) has "AZUser"
    project node_id = node.id, properties = node.properties
| sample 2
node_id 属性
5 {<br> "lastseen": "2025-08-11T09:21:19.002Z[UTC]",<br> "lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "enabled": true,<br> "displayname": "Jack Miller",<br> "name": "JMILLER@PHANTOMCORP.ONMICROSOFT.COM",<br> "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",<br> "objectid": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",<br> "onpremid": "",<br> "usertype": "Member",<br> "title": "",<br> "userprincipalname": "jmiller@phantomcorp.partner.onmschina.cn",<br> "system_tags": "admin_tier_0",<br> "pwdlastset": "2021-06-16T17:51:03Z[UTC]",<br> "onpremsyncenabled": false,<br> "whencreated": "2021-06-16T17:29:16Z[UTC]",<br> "email": ""<br>}
10 {<br> "lastseen": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "onpremid": "",<br> "usertype": "Member",<br> "title": "",<br> "lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "enabled": true,<br> "userprincipalname": "cjackson@phantomcorp.partner.onmschina.cn",<br> "system_tags": "admin_tier_0",<br> "displayname": "Chris Jackson",<br> "pwdlastset": "2022-07-19T15:18:49Z[UTC]",<br> "onpremsyncenabled": false,<br> "name": "CJACKSON@PHANTOMCORP.ONMICROSOFT.COM",<br> "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",<br> "whencreated": "2022-07-19T15:01:55Z[UTC]",<br> "email": "cjackson@phantomcorp.partner.onmschina.cn",<br> "objectid": "bbbbbbbb-1111-2222-3333-cccccccccccc"<br>}

边缘分析

了解图形中的关系对于识别模式、数据质量问题和潜在分析方向至关重要。

发现所有边缘类型 (适用于不同的图形架构):

此查询标识图形中的所有关系类型,帮助你了解可用于分析的连接。 不同的图形对边缘类型使用不同的属性名称,因此提供了多个变体。 此示例使用 BloodHound_Entra 图形 在 Microsoft entra 环境中显示权限关系。

graph('BloodHound_Entra')
| graph-match (source)-[edge]->(target)
    project edge_labels = labels(edge)
| mv-expand label = edge_labels to typeof(string)
| summarize count() by label
| top 5 by count_ desc
标签 计数_
AZMGAddOwner 403412
AZMGAddSecret 345324
AZAddSecret 24666
AZContains 12924
AZRunsAs 6269

查找大多数连接的节点(最高度):

节点度分析显示图形中最具影响力或中心实体。 高连接度节点通常代表关键角色、瓶颈或重要的基础设施组件。 此示例使用 LDBC_SNB_Interactive 图形,这是一个社交网络数据集,非常适合用于分析连接模式和影响。

// Find nodes with highest total degree (in + out)
graph('LDBC_SNB_Interactive')
| graph-match (node)
    project node_id = node.id, 
            in_degree = node_degree_in(node),
            out_degree = node_degree_out(node),
            total_degree = node_degree_in(node) + node_degree_out(node)
| order by total_degree desc
| take 5
node_id 入度 出度 总度数
0 41076 1 41077
1 35169 1 35170
50 12080 1 12081
49 11554 1 11555
58 7571 1 7572

查找入度最高(最大数量的传入连接)的节点

高入度节点通常是影响力的目标、热门目的地或中央资源。 在社交网络中,这些可能是有影响力的人;在基础结构图中,这些服务可能是关键服务。 此示例使用 LDBC_Financial 图形 标识接收最多事务的帐户。

graph('LDBC_Financial')
| graph-match (node)
    project node_id = node.node_id, 
            node_labels = labels(node),
            in_degree = node_degree_in(node)
| order by in_degree desc
| take 3
node_id 节点标签 入度
Account::99079191802151398 [
帐户
]
314
Account::4868391197187506662 [
帐户
]
279
Account::4896538694858573544 [
帐户
]
184

查找具有最高输出度(大多数传出连接)的节点:

出度高的节点通常是影响力来源、分发器或连接枢纽。 这些实体通常启动许多关系或将资源分发给其他人。 此示例使用 LDBC_Financial 图形 来标识进行大多数事务的帐户。

graph('LDBC_Financial')
| graph-match (node)
    project node_id = node.node_id, 
            node_labels = labels(node),
            out_degree = node_degree_out(node)
| order by out_degree desc
| take 3
node_id 节点标签 出度
Account::236720455413661980 [<br> "ACCOUNT"<br>] 384
Account::56576470318842045 [<br> "ACCOUNT"<br>] 106
Account::4890627720347648300 [<br> "ACCOUNT"<br>] 81

关系模式分析

这些查询有助于识别可能指示数据中重要行为或异常的结构模式和复杂关系。

发现三角关系 (在三角形中连接的节点):

三角模式通常表示紧密协作、相互依赖关系或封闭式loop流程。 在社交网络中,这些代表朋友组;在业务流程中,它们可能指示审批链或冗余模式。 此示例使用 BloodHound_AD graph 标识Active Directory环境中的循环特权关系。

graph('BloodHound_AD')
| graph-match (a)-->(b)-->(c)-->(a)
    where a.id != b.id and b.id != c.id and c.id != a.id
    project node1 = a.name, node2 = b.name, node3 = c.name
| take 3
node1 node2 node3
GHOST.CORP USERS@GHOST.CORP 域 CONTROLLERS@GHOST.CORP
WRAITH公司 USERS@WRAITH.CORP 域 CONTROLLERS@WRAITH.CORP
DU001@PHANTOM.CORP ADMINISTRATORS@PHANTOM.CORP 域 ADMINS@PHANTOM.CORP

属性分析

了解节点上可用的属性有助于生成更复杂的查询并识别数据质量问题。

浏览节点属性:

此查询显示使用节点存储的信息,帮助你了解可用于筛选和分析的属性。 此示例使用 BloodHound_Entra 图形 浏览 AZUser 节点的架构,并了解哪些属性可用于 Microsoft Entra 用户对象。

graph('BloodHound_Entra')
| graph-match (node)
    where labels(node) has "AZUser"  // Replace with actual label
    project properties = node.properties
| mv-apply properties on (
        mv-expand kind=array properties
        | where isnotempty(properties[1])
        | extend bag =bag_pack(tostring(properties[0]), properties[1])
        | summarize properties = make_bag(bag)
    )
| summarize buildschema(properties)
schema_properties
{<br> "onpremsyncenabled": "bool",<br> "system_tags": "string",<br> "lastcollected": "string",<br> "pwdlastset": "string",<br> "usertype": "string",<br> "userprincipalname": "string",<br> "email": "string",<br> "tenantid": "guid",<br> "name": "string",<br> "lastseen": "string",<br> "displayname": "string",<br> "enabled": "bool",<br> "title": "string",<br> "onpremid": "string",<br> "objectid": "guid",<br> "whencreated": "string"<br>}

按标签查找所有节点的所有属性:

此高级架构发现查询标识每个标签类型的节点中存在的所有属性名称。 与上一个显示架构结构的查询不同,此查询跨同一类型的所有节点聚合属性名称,帮助你了解哪些属性一致可用,这些属性可能是可选的或罕见的。 此示例使用 LDBC_SNB_Interactive 图形 浏览社交网络数据集中不同实体类型的完整属性布局。

graph('LDBC_SNB_Interactive')
| graph-match (node)
    project properties = node, labels = labels(node)
| mv-apply properties on (
        mv-expand kind=array properties
        | where isnotempty(properties[1])
        | summarize properties = make_set(properties[0])
    )
| mv-expand label = labels to typeof(string)
| summarize properties =make_set(properties) by label
| take 3
标签 属性
TAGCLASS [<br> "id",<br> "node_id",<br> "lbl",<br> "name",<br> "url"<br>]
标记 [<br> "id",<br> "node_id",<br> "lbl",<br> "name",<br> "url"<br>]
论坛 [<br> "id",<br> "creationDate",<br> "node_id",<br> "lbl",<br> "title"<br>]

按标签查找所有边缘的所有属性:

此查询对边缘(关系)属性执行架构发现,其中显示了图形中每种类型的关系存储的信息。 了解边缘属性对于分析关系元数据(例如时间戳、权重、置信度分数或其他提供连接上下文的属性)至关重要。 此示例使用 BloodHound_AD graph浏览不同类型的Active Directory特权关系可用的属性。

graph('BloodHound_AD')
| graph-match ()-[e]-()
    project properties = e, labels = labels(e)
| mv-apply properties on (
        mv-expand kind=array properties
        | where isnotempty(properties[1])
        | summarize properties = make_set(properties[0])
    )
| mv-expand label = labels to typeof(string)
| summarize properties =make_set(properties) by label
| take 3
标签 属性
获取所有更改 [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>]
OwnsRaw [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>]
添加密钥凭证链接 [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>]

查找具有特定属性值的节点:

使用此模式查找具有特定特征的实体,或通过检查预期的属性值来验证数据质量。 此示例使用 BloodHound_Entra 图形 在 Microsoft entra 环境中查找具有特定名称属性的节点。

graph('BloodHound_Entra')
| graph-match (node)
    where isnotempty(node.properties.name)
    project node_id = node.id, property_value = node.properties.name
| take 3
node_id 属性值
1 JJACOB@PHANTOMCORP.ONMICROSOFT.COM
10 CJACKSON@PHANTOMCORP.ONMICROSOFT.COM
12 RHALL@PHANTOMCORP.ONMICROSOFT.COM

图形的拓扑

了解图形的整体拓扑可显示不同实体类型之间存在的连接类型。 此分析可帮助你了解数据模型、识别最常见的关系模式,以及发现遍历查询的潜在路径。 拓扑查询显示哪些节点标签通过特定边缘类型连接到哪些其他节点标签,从而提供图形结构的综合视图。

//Topology of the graph - What's connected to what?
graph('LDBC_Financial')
| graph-match (src)-[e]->(dst)
    project SourceLabels = labels(src), EdgeLabels = labels(e), DestinationLabels = labels(dst)
| mv-expand EdgeLabel = EdgeLabels to typeof(string)
| mv-expand SourceLabel = SourceLabels to typeof(string)
| mv-expand DestinationLabel = DestinationLabels to typeof(string)
| summarize Count = count() by SourceLabel, EdgeLabel, DestinationLabel
源标签 EdgeLabel 目标标签 计数
公司 保证 公司 202
公司 APPLY 贷款 449
人 APPLY 贷款 927
帐户 偿还 贷款 2747
贷款 存款 帐户 2758
帐户 转移 帐户 8132
帐户 撤回 帐户 9182
人 保证 人 377
公司 拥有 帐户 671
公司 投资 公司 679
人 拥有 帐户 1384
中等 登录 帐户 2489
人 投资 公司 1304