运算符 graph-match
可在输入图形源中搜索图形模式的所有匹配项。
注意
此运算符与 生成图形运算符一起使用。
语法
G|
graph-match
[cycles
=
CyclesOption] Pattern [where
constraints] project
[ColumnName=
] expression [,
...]
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
G | string |
✔️ | 输入图源。 |
模式 | string |
✔️ | 一个或多个逗号分隔的图节点元素序列,这些元素是使用图表示法通过图边元素连接的。 请参阅《图形模式表示法》。 |
约束 | string |
布尔表达式,由模式中命名变量的属性组成。 每个图形元素(节点/边缘)具有一组在图形构造过程中附加到它的属性。 约束定义了模型匹配了哪些元素(节点和边缘)。 属性由变量名称引用,后跟一个点(. )和属性名称。 |
|
表达式 | string |
✔️ |
project 子句将每个模式转换为表格结果中的一行。 项目表达式必须是 模式中定义的命名变量的标量和引用属性。 属性由变量名称引用,后跟一个点(. )和属性名称。 |
CyclesOption | string |
控制周期是否在模式中匹配,允许的值:all 、none 、unique_edges 。 如果指定了 all ,则所有周期都匹配,如果 none 未匹配,则指定 unique_edges (默认值)时,将匹配周期,但仅当周期不包含同一边缘多次时才匹配。 |
图形模式表示法
下表显示了支持的图形表示法:
元素 | 命名变量 | 匿名 |
---|---|---|
节点 |
(
n) |
() |
定向边缘:从左到右 |
-[
e]-> |
--> |
定向边缘:从右到左 |
<-[
e]- |
<-- |
任何方向边缘 |
-[
e]- |
-- |
可变长度边缘 |
-[
e*3..5]- |
-[*3..5]- |
可变长度边缘
可变长度边缘允许在定义的限制内多次重复特定模式。 这种类型的边缘由星号(*
)表示,后跟最小值..
最大值格式的最小和最大出现值。 最小值和最大值必须是整数标量。 如果序列中的所有边缘满足 where
子句中概述的约束,则此出现范围中的任何边缘序列都可以匹配模式的可变边缘。
多个序列
多个逗号分隔的序列用于表达非线性模式。 为了描述不同序列之间的连接,它们必须共享节点的一个或多个变量名称。 例如,若要表示一个星型模式,其中节点 n 位于中心,、b、c和 d,可以使用以下模式:
(
)--(
n)--(
b)
,(
c)--(
n)--(
d)
仅支持单个连接的组件模式。
返回
运算符 graph-match
会返回表格结果,其中每个记录对应于图形中该模式的匹配项。
返回的列使用模式中定义的边缘和/或节点属性在运算符的 project
子句中定义。 可变长度边缘的属性和属性函数将作为动态数组返回,数组中的每个值对应于可变长度边缘的一次出现。
示例
以下示例表示组织层次结构。 它演示了如何使用可变长度边缘在单个查询中查找层次结构不同级别的员工。 图中的节点表示员工,边缘则是从员工到其经理。 使用 make-graph
生成图形后,我们将搜索 Alice
组织中小于 30
的员工。
let employees = datatable(name:string, age:long)
[
"Alice", 32,
"Bob", 31,
"Eve", 27,
"Joe", 29,
"Chris", 45,
"Alex", 35,
"Ben", 23,
"Richard", 39,
];
let reports = datatable(employee:string, manager:string)
[
"Bob", "Alice",
"Chris", "Alice",
"Eve", "Bob",
"Ben", "Chris",
"Joe", "Alice",
"Richard", "Bob"
];
reports
| make-graph employee --> manager with employees on name
| graph-match (alice)<-[reports*1..5]-(employee)
where alice.name == "Alice" and employee.age < 30
project employee = employee.name, age = employee.age, reportingPath = map(reports, manager)
输出
员工 | 年龄 | reportingPath |
---|---|---|
乔 | 二十九 | [ “Alice” ] |
前夕 | 二十七 | [ “Alice”, “Bob” ] |
本 | 23 | [ “Alice”, “Chris” ] |
以下示例可更具 Actions
和 Entities
表生成图形。 实体是人员和系统,操作则描述实体之间的不同关系。 生成图形的 make-graph
运算符是调用 graph-match
的图形模式,该模式搜索 "Apollo"
系统的攻击路径。
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
输出
攻击者 | 已泄露 | 系统 |
---|---|---|
马洛里 | 鲍勃 | 阿波罗 |
以下示例类似于上一个攻击路径示例,但具有额外的约束:我们希望已泄露的实体也与 Alice通信。
graph-match
模式前缀与前面的示例相同,我们将添加另一个序列,泄露 作为序列之间的链接。
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo), (compromised)-[communicates]-(alice)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission" and alice.name == "Alice"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
输出
攻击者 | 已泄露 | 系统 |
---|---|---|
马洛里 | 鲍勃 | 阿波罗 |