Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator make-graph tworzy strukturę grafu na podstawie tabelarycznych danych wejściowych krawędzi i węzłów.
Składnia
| [ make-graphNodeId2 ]]
Krawędzie|make-graphIdentyfikator węzła źródłowego-->TargetNodeId [ with_node_id=NodeIdPropertyName ]
Krawędzie|make-graphIdentyfikator węzła źródłowego-->TargetNodeId [ withWęzły1onNodeId1 [,Węzły2onNodeId2 ]] partitioned-byPartitionColumn(GraphOperator)
Parametry
| Nazwisko | Typ | Wymagania | opis |
|---|---|---|---|
| Krawędzie | string |
✔️ | Źródło tabelaryczne zawierające krawędzie grafu, każdy wiersz reprezentuje krawędź na grafie. |
| Identyfikator węzła źródłowego | string |
✔️ | Kolumna w krawędziach z identyfikatorami węzłów źródłowych krawędzi. |
| TargetNodeId | string |
✔️ | Kolumna w krawędziach z identyfikatorami węzłów docelowych krawędzi. |
| węzły 1, węzły 2 | string |
Wyrażenia tabelaryczne zawierające właściwości węzłów na grafie. | |
| NodesId1, NodesId2 | string |
Odpowiednie kolumny z identyfikatorami węzłów w węzłach 1, Węzły2. | |
| NodeIdPropertyName | string |
Nazwa właściwości identyfikatora węzła w węzłach grafu. | |
| Kolumna partycji | string |
Kolumna do partycjonowania grafu według. Tworzy oddzielne grafy dla każdej unikatowej wartości w tej kolumnie. | |
| GraphOperator | string |
Operator grafu, który ma być stosowany do każdego partycjonowanego grafu. |
Zwraca
Operator make-graph zwraca wyrażenie grafu i musi być zgodny z operatorem grafu. Każdy wiersz w wyrażeniu krawędzi źródłowych staje się krawędzią na grafie z właściwościami, które są wartościami kolumn wiersza. Każdy wiersz w wyrażeniu tabelarycznym Węzły staje się węzłem na grafie z właściwościami, które są wartościami kolumn wiersza. Węzły, które są wyświetlane w tabeli Edges, ale nie mają odpowiedniego wiersza w tabeli Węzły, są tworzone jako węzły z odpowiednim identyfikatorem węzła i pustymi właściwościami.
W przypadku używania klauzuli partitioned-by oddzielne grafy są tworzone dla każdej unikatowej wartości w określonej kolumnie partycji. Określony moduł GraphOperator jest następnie stosowany do każdego partycjonowanego grafu niezależnie, a wyniki są łączone w pojedyncze dane wyjściowe. Jest to szczególnie przydatne w scenariuszach wielodostępnych, w których chcesz oddzielnie analizować dane każdej dzierżawy przy zachowaniu tej samej struktury grafu i logiki analizy.
Ważne
W przypadku używania partitioned-by klauzuli zarówno tabela Edges, jak i wszystkie tabele Węzły muszą zawierać kolumnę partycji.
Uwaga
Każdy węzeł ma unikatowy identyfikator. Jeśli ten sam identyfikator węzła pojawi się w tabelach Node1 i Nodes2 , jeden węzeł jest tworzony przez scalenie ich właściwości. Jeśli występują konflikty wartości właściwości dla tego samego węzła, jedna z wartości jest dowolnie wybierana.
Użytkownicy mogą obsługiwać informacje o węźle w następujący sposób:
-
Brak wymaganych informacji o węźle:
make-graphkończy się elementem źródłowym i docelowym. -
Jawne właściwości węzła: użyj maksymalnie dwóch wyrażeń tabelarycznych przy użyciu węzłów "
withNodeId11on[,NodeId2]." -
Domyślny identyfikator węzła: użyj wartości "
with_node_id=DefaultNodeId".
Przykład
Wykres krawędzi i węzłów
Poniższy przykład tworzy graf z tabel krawędzi i węzłów. Węzły reprezentują osoby i systemy, a krawędzie reprezentują różne relacje między węzłami. Operator make-graph tworzy graf.
graph-match Następnie operator jest używany ze wzorcem grafu do wyszukiwania ścieżek ataku prowadzących do węzła systemowego"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
Wyjście
| Osoba atakująca | Zagrożone | System |
|---|---|---|
| Mallory | Robert | Trent |
Domyślny identyfikator węzła
Poniższy przykład tworzy graf przy użyciu tylko krawędzi z name właściwością jako domyślnym identyfikatorem węzła. Takie podejście jest przydatne podczas tworzenia grafu na podstawie tabelarycznego wyrażenia krawędzi, zapewniając, że identyfikator węzła jest dostępny dla sekcji ograniczeń kolejnego graph-match operatora.
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
Wyjście
| Osoba atakująca | Zagrożone | System |
|---|---|---|
| Mallory | Robert | Trent |
Wykres podzielony na partycje
W tym przykładzie pokazano użycie klauzuli partitioned-by do analizowania wielodostępnej sieci społecznościowej. Klauzula partitioned-by tworzy oddzielne grafy dla każdej unikatowej wartości w kolumnie partycji (w tym przypadku tenantId), stosuje operator grafu do każdej partycji niezależnie i łączy wyniki.
// 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 | Najemcy | Koniec |
|---|---|---|
| Bob Smith (CompanyA) | [ "CompanyA", "CompanyA" ] |
Diana Finch (CompanyA) |
| Henry Davis (CompanyB) | [ "CompanyB", "FirmaB" ] |
Grace Lee (CompanyB) |