Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der make-graph Operator erstellt eine Diagrammstruktur aus tabellarischen Eingaben von Kanten und Knoten.
Syntax
Edges|make-graph SourceNodeId--> TargetNodeId [ withNodes1on NodeId1 [,Nodes2onNodeId2 ]]
Kanten|make-graphSourceNodeId-->TargetNodeId [ with_node_id=NodeIdPropertyName ]
Kanten|make-graphSourceNodeId-->TargetNodeId [ withNodes1onNodeId1 [,Nodes2onNodeId2 ]] partitioned-byPartitionColumn(GraphOperator)
Parameter
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| Kanten | string |
✔️ | Die tabellarische Quelle, die die Ränder des Diagramms enthält, stellt jede Zeile einen Rand im Diagramm dar. |
| SourceNodeId | string |
✔️ | Die Spalte in Edges mit den Quellknoten-IDs der Kanten. |
| TargetNodeId | string |
✔️ | Die Spalte in Edges mit den Zielknoten-IDs der Kanten. |
| Knoten1, Knoten2 | string |
Die tabellarischen Ausdrücke, die die Eigenschaften der Knoten im Diagramm enthalten. | |
| NodesId1, NodesId2 | string |
Die entsprechenden Spalten mit den Knoten-IDs in Knoten1, Knoten2. | |
| NodeIdPropertyName- | string |
Der Name der Eigenschaft für die Knoten-ID auf den Knoten des Diagramms. | |
| PartitionColumn | string |
Die Spalte zum Partitionieren des Diagramms nach. Erstellt separate Diagramme für jeden eindeutigen Wert in dieser Spalte. | |
| GraphOperator | string |
Der Diagrammoperator, der auf jedes partitionierte Diagramm angewendet werden soll. |
Gibt zurück
Der make-graph Operator gibt einen Diagrammausdruck zurück und muss von einem Diagrammoperator gefolgt werden. Jede Zeile im Quell-Edges-Ausdruck wird zu einem Rand im Diagramm mit Eigenschaften, die die Spaltenwerte der Zeile sind. Jede Zeile im tabellarischen Ausdruck "Knoten " wird zu einem Knoten im Diagramm mit Eigenschaften, die die Spaltenwerte der Zeile sind. Knoten, die in der Tabelle "Kanten" angezeigt werden, aber keine entsprechende Zeile in der Tabelle "Knoten " haben, werden als Knoten mit der entsprechenden Knoten-ID und leeren Eigenschaften erstellt.
Bei Verwendung der partitioned-by Klausel werden separate Diagramme für jeden eindeutigen Wert im angegebenen PartitionColumn erstellt. The specified GraphOperator is then applied to each partitioned graph independently, and the results are combined into a single output. Dies ist besonders nützlich für Multitenant-Szenarien, in denen Sie die Daten der einzelnen Mandanten separat analysieren möchten, während die gleiche Diagrammstruktur und Analyselogik beibehalten werden.
Von Bedeutung
Bei Verwendung der partitioned-by Klausel müssen sowohl die Edges-Tabelle als auch alle Knotentabellen die Partitionsspalte enthalten.
Hinweis
Jeder Knoten verfügt über einen eindeutigen Bezeichner. Wenn die gleiche Knoten-ID sowohl in den Tabellen "Knoten1 " als auch "Knoten2 " angezeigt wird, wird ein einzelner Knoten durch Zusammenführen ihrer Eigenschaften erstellt. Wenn konfliktende Eigenschaftswerte für denselben Knoten vorhanden sind, wird einer der Werte willkürlich ausgewählt.
Benutzer können Knoteninformationen auf folgende Weise behandeln:
-
Es sind keine Knoteninformationen erforderlich:
make-graphwird mit Quelle und Ziel abgeschlossen. -
Explizite Knoteneigenschaften: Verwenden von bis zu zwei tabellarischen Ausdrücken mit "
withNodeId1 [onNodeId2 ]." -
Standardknotenbezeichner: "DefaultNodeId" verwenden
with_node_id=.
Beispiel
Ränder und Knotendiagramm
Im folgenden Beispiel wird ein Diagramm aus Rändern und Knotentabellen erstellt. Die Knoten stellen Personen und Systeme dar, und die Kanten stellen unterschiedliche Beziehungen zwischen Knoten dar. Der make-graph Operator erstellt das Diagramm. Anschließend wird der graph-match Operator mit einem Diagrammmuster verwendet, um nach Angriffspfaden zu suchen, die "Trent" zum Systemknoten führen.
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
Output
| Angreifer | Kompromittiert | System |
|---|---|---|
| Mallory | Bob | Trent |
Standardknotenbezeichner
Im folgenden Beispiel wird ein Diagramm erstellt, das nur Ränder verwendet, wobei die name Eigenschaft als Standardknotenbezeichner verwendet wird. Dieser Ansatz ist hilfreich beim Erstellen eines Diagramms aus einem tabellarischen Ausdruck von Kanten, um sicherzustellen, dass der Knotenbezeichner für den Einschränkungsbereich des nachfolgenden graph-match Operators verfügbar ist.
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
Output
| Angreifer | Kompromittiert | System |
|---|---|---|
| Mallory | Bob | Trent |
Partitioniertes Diagramm
In diesem Beispiel wird die Verwendung der partitioned-by Klausel zum Analysieren eines mehrinstanzenübergreifenden sozialen Netzwerks veranschaulicht. Die partitioned-by Klausel erstellt separate Diagramme für jeden eindeutigen Wert in der Partitionsspalte (in diesem Fall tenantId), wendet den Diagrammoperator unabhängig auf jede Partition an und kombiniert die Ergebnisse.
// Nodes table representing users across multiple tenants (organizations)
let nodes = datatable(userId:string, tenantId:string, name:string, department:string, role:string, location:dynamic)
[
// Tenant: CompanyA - San Francisco Bay Area
"u001", "CompanyA", "Alice Johnson", "Engineering", "Senior Developer", dynamic({"type": "Point", "coordinates": [-122.4194, 37.7749]}),
"u002", "CompanyA", "Bob Smith", "Engineering", "Team Lead", dynamic({"type": "Point", "coordinates": [-122.4094, 37.7849]}),
"u003", "CompanyA", "Charlie Black", "Marketing", "Manager", dynamic({"type": "Point", "coordinates": [-122.4294, 37.7649]}),
"u004", "CompanyA", "Diana Finch", "HR", "Director", dynamic({"type": "Point", "coordinates": [-122.3994, 37.7949]}),
"u005", "CompanyA", "Eve Wilson", "Engineering", "Junior Developer", dynamic({"type": "Point", "coordinates": [-122.4394, 37.7549]}),
// Tenant: CompanyB - New York Area
"u006", "CompanyB", "Frank Miller", "Sales", "Account Manager", dynamic({"type": "Point", "coordinates": [-74.0060, 40.7128]}),
"u007", "CompanyB", "Grace Lee", "Engineering", "Senior Developer", dynamic({"type": "Point", "coordinates": [-74.0160, 40.7228]}),
"u008", "CompanyB", "Henry Davis", "Marketing", "Specialist", dynamic({"type": "Point", "coordinates": [-73.9960, 40.7028]}),
"u009", "CompanyB", "Ivy Chen", "Engineering", "Team Lead", dynamic({"type": "Point", "coordinates": [-74.0260, 40.7328]}),
"u010", "CompanyB", "Jack Thompson", "Operations", "Manager", dynamic({"type": "Point", "coordinates": [-73.9860, 40.6928]}),
// Tenant: CompanyC - Austin Area
"u011", "CompanyC", "Kate Anderson", "Finance", "Analyst", dynamic({"type": "Point", "coordinates": [-97.7431, 30.2672]}),
"u012", "CompanyC", "Liam Murphy", "Engineering", "Architect", dynamic({"type": "Point", "coordinates": [-97.7331, 30.2772]}),
"u013", "CompanyC", "Maya Patel", "Product", "Manager", dynamic({"type": "Point", "coordinates": [-97.7531, 30.2572]}),
"u014", "CompanyC", "Noah Garcia", "Engineering", "Developer", dynamic({"type": "Point", "coordinates": [-97.7631, 30.2472]}),
"u015", "CompanyC", "Olivia Rodriguez", "Marketing", "Director", dynamic({"type": "Point", "coordinates": [-97.7231, 30.2872]})
];
// Edges table representing relationships/interactions between users
let edges = datatable(sourceUserId:string, targetUserId:string, tenantId:string, relationshipType:string, strength:int)
[
// CompanyA relationships
"u001", "u002", "CompanyA", "reportsTo", 9,
"u005", "u002", "CompanyA", "reportsTo", 8,
"u002", "u003", "CompanyA", "collaborates", 6,
"u001", "u005", "CompanyA", "mentors", 7,
"u003", "u004", "CompanyA", "collaborates", 5,
"u001", "u003", "CompanyA", "communicates", 4,
// CompanyB relationships
"u007", "u009", "CompanyB", "reportsTo", 9,
"u006", "u010", "CompanyB", "reportsTo", 8,
"u008", "u006", "CompanyB", "collaborates", 6,
"u009", "u010", "CompanyB", "communicates", 5,
"u007", "u008", "CompanyB", "mentors", 7,
"u006", "u007", "CompanyB", "collaborates", 6,
// CompanyC relationships
"u014", "u012", "CompanyC", "reportsTo", 9,
"u012", "u013", "CompanyC", "collaborates", 7,
"u011", "u013", "CompanyC", "collaborates", 6,
"u013", "u015", "CompanyC", "reportsTo", 8,
"u012", "u015", "CompanyC", "communicates", 5,
"u011", "u014", "CompanyC", "mentors", 6
];
edges
| make-graph sourceUserId --> targetUserId with nodes on userId partitioned-by tenantId (
graph-match cycles=none (n1)-[e*2..4]->(n2)
where n1.userId != n2.userId and all(e, relationshipType == "collaborates") and
geo_distance_2points(todouble(n1.location.coordinates[0]), todouble(n1.location.coordinates[1]),
todouble(n2.location.coordinates[0]), todouble(n2.location.coordinates[1])) < 10000
project Start = strcat(n1.name, " (", n1.tenantId, ")"), Tenants = map(e, tenantId), End = strcat(n2.name, " (", n2.tenantId, ")")
)
| Start | Mieter | ENDE |
|---|---|---|
| Bob Smith (CompanyA) | [ "CompanyA", "CompanyA" ] |
Diana Finch (CompanyA) |
| Henry Davis (CompanyB) | [ "CompanyB", "CompanyB" ] |
Grace Lee (CompanyB) |