适用于:✅Azure 数据资源管理器
检索与图形查询中的节点或边缘关联的标签。 使用此函数按标签筛选图形元素,或在查询结果中包含标签信息。
标签在 图形模型中 定义,可以是静态的(分配给节点或边缘类型的固定标签)或动态(在图形构造期间派生自数据属性的标签)。
重要
该 labels() 函数仅适用于 图形模型。 在使用 make-graph 运算符创建的图形上调用时,它始终返回一个空数组,因为暂时性图形没有标签元数据。
语法
labels(
元素)
labels()
参数
| 名称 | 类型 | 必选 | DESCRIPTION |
|---|---|---|---|
| 元素 | string |
✔️ | 图形模式中的节点或边缘变量引用。 当在 labels()、any()或 map() 图形函数中使用 inner_nodes() 时省略此参数。 有关详细信息,请参阅 图形模式表示法。 |
退货
返回包含与指定节点或边缘关联的标签的字符串的动态数组。 返回不带标签的元素的空数组,或者与使用 make-graph 运算符创建的图形一起使用时。
在没有参数的情况下在 all()、 any()或 map() 中使用 inner_nodes()调用时,将返回路径中每个内部节点或边缘的标签。
标签类型
该 labels() 函数检索图形模型中定义的静态标签和动态标签。 有关静态和动态标签的详细信息,包括何时使用每种类型,请参阅 Graph 模型中的标签。
例子
这些示例使用示例数据库中帮助群集上提供的示例图。 有关这些数据集的详细信息,请参阅 Graph 示例数据集。
示例 1:按标签筛选节点
此示例演示了使用简单教育图基于其标签筛选节点。 该查询查找在特定公司工作并按“人员”标签筛选的所有人员。
graph("Simple")
| graph-match (person)-[works_at]->(company)
where labels(person) has "Person"
and company.name == "TechCorp"
project employee_name = person.name,
employee_age = person.properties.age,
employee_labels = labels(person)
| employee_name | employee_age | employee_labels |
|---|---|---|
| 爱丽丝 | 二十五 | [“Person”] |
| 鲍勃 | 30 | [“Person”] |
| 艾玛 | 26 | [“Person”] |
此labels(person)"Person"“人员”标签筛选节点,确保我们使用人员实体而不是图形中的其他节点类型。
示例 2:结果中的项目标签
此示例演示如何在使用 LDBC SNB 交互式数据集分析社交网络时在查询结果中包含标签信息。 该查询查找喜欢帖子和投影标签的人员。
graph("LDBC_SNB_Interactive")
| graph-match (person)-[likes]->(post)-[has_creator]->(creator)
where labels(person) has "PERSON"
and labels(post) has "POST"
and labels(has_creator) has "HAS_CREATOR"
project
person_name = person.firstName,
creator_name = creator.firstName,
person_labels = labels(person),
post_labels = labels(post),
edge_labels = labels(has_creator)
| take 5
| person_name | creator_name | person_labels | post_labels | edge_labels |
|---|---|---|---|---|
| 阿卜杜拉 | Mahinda | [“PERSON”] | [“POST”] | [“HAS_CREATOR”] |
| 阿卜杜拉 | Mahinda | [“PERSON”] | [“POST”] | [“HAS_CREATOR”] |
| 阿卜杜拉 | Mahinda | [“PERSON”] | [“POST”] | [“HAS_CREATOR”] |
| 阿卜杜拉 | Mahinda | [“PERSON”] | [“POST”] | [“HAS_CREATOR”] |
| 卡尔 | Mahinda | [“PERSON”] | [“POST”] | [“HAS_CREATOR”] |
此查询投影用于 labels() 节点和边缘的标签,其中显示了标签如何帮助对复杂社交网络中的不同实体类型进行分类。
示例 3:按多个标签条件进行筛选
此示例演示如何使用多个标签条件来标识 LDBC 财务数据集中的财务交易模式。 该查询查找通过特定节点和边缘标签将资金转移到其他帐户和筛选器的帐户。
graph("LDBC_Financial")
| graph-match (account1)-[transfer]->(account2)
where labels(account1) has "ACCOUNT"
and labels(account2) has "ACCOUNT"
and labels(transfer) has "TRANSFER"
and transfer.amount > 1000000
project
from_account = account1.node_id,
to_account = account2.node_id,
amount = transfer.amount,
source_labels = labels(account1),
target_labels = labels(account2),
edge_labels = labels(transfer)
| take 5
| from_account | to_account | 量 | source_labels | target_labels | edge_labels |
|---|---|---|---|---|---|
| Account::56576470318842045 | Account::4652781365027145396 | 5602050,75 | [“ACCOUNT”] | [“ACCOUNT”] | [“TRANSFER”] |
| Account::56576470318842045 | Account::4674736413210576584 | 7542124,31 | [“ACCOUNT”] | [“ACCOUNT”] | [“TRANSFER”] |
| Account::4695847036463875613 | Account::41939771529888100 | 2798953,34 | [“ACCOUNT”] | [“ACCOUNT”] | [“TRANSFER”] |
| Account::40532396646334920 | Account::99079191802151398 | 1893602,99 | [“ACCOUNT”] | [“ACCOUNT”] | [“TRANSFER”] |
| Account::98797716825440579 | Account::4675580838140707611 | 3952004,86 | [“ACCOUNT”] | [“ACCOUNT”] | [“TRANSFER”] |
此查询链接多个标签条件,以确保节点和边缘都具有正确的类型,这对于金融网络中准确的模式匹配至关重要。
示例 4:将标签()与 inner_nodes() 和集合函数配合使用
此示例演示如何在使用 BloodHound Active Directory 数据集中的可变长度路径时,在内部使用labels()不带any()参数map()的inner_nodes()函数和函数。 该查询查找特权提升路径,其中路径上的至少一个边缘具有危险的权限标签,还基于中间节点的标签筛选。
graph("BloodHound_AD")
| graph-match (user)-[path*1..3]->(target)
where labels(user) has "User"
and labels(target) has "Group"
and target.properties.admincount == true
and any(path, labels() has_any ("GenericAll", "WriteDacl", "WriteOwner", "GenericWrite", "Owns"))
and all(inner_nodes(path), labels() has_any ("User", "Group"))
project
attacker = user.name,
target_group = target.name,
path_length = array_length(path),
permission_chain = map(path, labels()),
intermediate_node_labels = map(inner_nodes(path), labels())
| take 5
| 攻击者 | target_group | path_length | permission_chain | intermediate_node_labels |
|---|---|---|---|---|
| HACKERDA@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 2 | [[“MemberOf”], [“WriteOwner”]] | [[“Base”, “Group”]] |
| ROSHI@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 2 | [[“MemberOf”], [“WriteOwner”]] | [[“Base”, “Group”]] |
| FABIAN@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 2 | [[“MemberOf”], [“WriteOwner”]] | [[“Base”, “Group”]] |
| ANDY@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 2 | [[“MemberOf”], [“WriteOwner”]] | [[“Base”, “Group”]] |
| CHARLIE@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 2 | [[“MemberOf”], [“WriteOwner”]] | [[“Base”, “Group”]] |
在此查询中, labels() 以多种方式使用:
- 用于
any(path, labels() has_any (...))检查边缘标签是否有危险权限 - 用于
all(inner_nodes(path), labels() has_any (...))基于中间节点标签筛选路径 - 用于
map(path, labels())显示每个路径的边缘标签 - 用于
map(inner_nodes(path), labels())在路径中显示中间节点的标签
这演示了如何 labels() 与 inner_nodes() 无缝配合工作,以在可变长度路径中访问边缘和节点标签。