graph-match 运算符
运算符 graph-match
可在输入图形源中搜索图形模式的所有匹配项。
语法
G |
graph-match
[cycles
=
CyclesOption] Pattern where
Constraints project
[ColumnName =
] Expression [,
...]
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
G | string |
✔️ | 输入图源。 |
模式 | string |
✔️ | 一个或多个逗号分隔的图节点元素序列,这些元素是使用图表示法通过图边元素连接的。 请参阅《图形模式表示法》。 |
约束 | string |
✔️ | 布尔表达式,由模式中命名变量的属性组成。 每个图形元素(节点/边缘)具有一组在图形构造过程中附加到它的属性。 约束定义了模型匹配了哪些元素(节点和边缘)。 属性由变量名称引用,后跟一个点(. )和属性名称。 |
Expression | string |
project 子句将每个模式转换为表格结果中的一行。 项目表达式必须是标量,并引用模式中定义的命名变量的属性。 属性由变量名称引用,后跟一个点(. )和属性名称。 |
|
CyclesOption | string |
控制周期是否在模式中匹配,允许的值:all 、none 、unique_edges 。 如果指定了 all ,则匹配所有周期,如果指定了 none ,则不匹配周期,如果指定了 unique_edges (默认值),则仅在该周期未多次包含同一边时匹配周期。 |
图形模式表示法
下表显示了支持的图形表示法:
元素 | 命名变量 | 匿名 |
---|---|---|
节点 | ( n) |
() |
定向边缘:从左到右 | -[ e]-> |
--> |
定向边缘:从右到左 | <-[ e]- |
<-- |
任何方向边缘 | -[ e]- |
-- |
可变长度边缘 | -[ e*3..5]- |
-[*3..5]- |
可变长度边缘
可变长度边缘允许在定义的限制内多次重复特定模式。 这种类型的边缘由星号(*
)表示,后跟最小值..
最大值格式的最小和最大出现值。 最小值和最大值必须是整数标量。 如果序列中的所有边缘满足 where
子句中概述的约束,则此出现范围中的任何边缘序列都可以匹配模式的可变边缘。
多个序列
多个逗号分隔的序列用于表达非线性模式。 为了描述不同序列之间的连接,它们必须共享节点的一个或多个变量名称。 例如,若要表达一个星型模式(其中节点 n 位于星形中心并连接到节点 a、b、c 和 d),则可以使用以下模式:(
a)--(
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 = reports.manager
输出
employee | age | reportingPath |
---|---|---|
Joe | 29 | [ "Alice" ] |
Eve | 27 | [ "Alice", "Bob" ] |
Ben | 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
输出
攻击者 | 已泄露 | 系统 |
---|---|---|
Mallory | Bob | Apollo |
星形模式
以下示例类似于上一个攻击路径示例,但还有另一个约束:我们希望遭入侵的实体也与 Alice 通信。 graph-match
模式前缀与上一个示例相同,并且我们添加了另一个序列,并将“compromised”作为序列之间的链接。
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
输出
攻击者 | 已泄露 | 系统 |
---|---|---|
Mallory | Bob | Apollo |