make-graph 運算符
運算子 make-graph
會從邊緣和節點的表格式輸入建置圖形結構。
語法
Edges|
-->
[ Nodes1with
NodeId1 [on
,
Nodes2on
NodeId2 ]]
Edges|
make-graph
-->
[ with_node_id=
DefaultNodeId ]
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
邊緣 | string |
✔️ | 包含圖形邊緣的表格式來源,每個數據列都代表圖形中的邊緣。 |
SourceNodeId | string |
✔️ | Edge 中具有邊緣來源節點標識碼的數據行。 |
TargetNodeId | string |
✔️ | Edge 中具有邊緣目標節點標識碼的數據行。 |
節點 | string |
包含圖形中節點屬性的表格式表達式。 | |
NodesId | string |
節點中具有節點標識碼的數據行。 | |
DefaultNodeId | string |
預設節點識別碼的數據行名稱。 |
傳回
make-graph
運算符會傳回圖表表達式,且後面必須接著圖形運算元。 來源 Edges 運算式中的每個數據列都會成為圖形中的邊緣,其中包含數據列數據行值的屬性。 Nodes 表格式表示式中的每個數據列都會成為圖形中的節點,其中包含數據列數據行值的屬性。 出現在 Edges 數據表但 Nodes 數據表中沒有對應數據列的節點會建立為具有對應節點識別碼和空白屬性的節點。
注意
每個節點都有唯一標識碼。 如果 Nodes1 和 Nodes2 資料表中出現相同的節點識別碼,則會藉由合併其屬性來建立單一節點。 如果相同節點有衝突的屬性值,則會任意選擇其中一個值。
使用者可以以下欄方式處理節點資訊:
-
不需要節點資訊:
make-graph
使用來源和目標完成。 -
明確節點屬性:最多使用兩個表格式表達式,使用 “
on
NodeId1 [on
NodeId2 ]。” -
默認節點標識碼:使用 「
with_node_id=
DefaultNodeId」。。
範例
邊緣和節點圖形
下列範例會從邊緣和節點數據表建置圖形。 節點代表人員和系統,邊緣代表節點之間的不同關聯性。 運算子 make-graph
會建置圖形。 然後, graph-match
運算符會與圖形模式搭配使用,以搜尋導致系統 "Trent"
節點的攻擊路徑。
let nodes = datatable(name:string, type:string, age:int)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Trent", "System", 99
];
let edges = datatable(Source:string, Destination:string, edge_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Trent", "trusts",
"Bob", "Trent", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
edges
| make-graph Source --> Destination with nodes on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(trent)
where mallory.name == "Mallory" and trent.name == "Trent" and attacks.edge_type == "attacks" and hasPermission.edge_type == "hasPermission"
project Attacker = mallory.name, Compromised = compromised.name, System = trent.name
輸出
攻擊者 | 遭洩漏 | 系統 |
---|---|---|
馬婁裡 | Bob | 特 倫 特 |
默認節點識別碼
下列範例只會使用邊緣建置圖形,並將 name
屬性當做默認節點標識碼。 從邊緣表格式表示式建立圖形時,此方法很有用,可確保節點標識碼可供後續 graph-match
運算符的條件約束區段使用。
let edges = datatable(source:string, destination:string, edge_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Trent", "trusts",
"Bob", "Trent", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
edges
| make-graph source --> destination with_node_id=name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(trent)
where mallory.name == "Mallory" and trent.name == "Trent" and attacks.edge_type == "attacks" and hasPermission.edge_type == "hasPermission"
project Attacker = mallory.name, Compromised = compromised.name, System = trent.name
輸出
攻擊者 | 遭洩漏 | 系統 |
---|---|---|
馬婁裡 | Bob | 特 倫 特 |