labels()

适用于:✅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() 无缝配合工作,以在可变长度路径中访问边缘和节点标签。