Delen via


operator voor make-graph

Schakelen tussen services met behulp van de vervolgkeuzelijst Versie . Meer informatie over navigatie.
Van toepassing op: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

De operator make-graph bouwt een grafiekstructuur op basis van tabellaire invoer van randen en knooppunten.

Syntaxis

Randen|make-graphSourceNodeId-->TargetNodeId [ withNodes1onNodeId1 [,Nodes2onNodeId2 ]]

Randen|make-graphSourceNodeId-->TargetNodeId [ with_node_id=NodeIdPropertyName ]

Randen|make-graphSourceNodeId-->TargetNodeId [ withNodes1onNodeId1 [,Nodes2onNodeId2 ]] partitioned-byPartitionColumn(GraphOperator)

Parameters

Naam Type Vereist Beschrijving
Edges string ✔️ De tabellaire bron met de randen van de grafiek, elke rij vertegenwoordigt een rand in de grafiek.
SourceNodeId- string ✔️ De kolom in Edges met de bronknooppunt-id's van de randen.
TargetNodeId- string ✔️ De kolom in Edges met de doelknooppunt-id's van de randen.
Knooppunten1, Knooppunten2 string De tabellaire expressies met de eigenschappen van de knooppunten in de grafiek.
NodesId1, NodesId2- string De bijbehorende kolommen met de knooppunt-id's in Nodes1respectievelijk Nodes2.
NodeIdPropertyName string De naam van de eigenschap voor knooppunt-id op de knooppunten van de grafiek.
PartitionColumn string De kolom waarop de grafiek moet worden gepartitioneerd. Hiermee maakt u afzonderlijke grafieken voor elke unieke waarde in deze kolom.
GraphOperator string De grafiekoperator die moet worden toegepast op elke gepartitioneerde grafiek.

Retourneert

De operator make-graph retourneert een grafiekexpressie en moet worden gevolgd door een grafiekoperator. Elke rij in de bron Edges expressie wordt een rand in de grafiek met eigenschappen die de kolomwaarden van de rij zijn. Elke rij in de Knooppunten tabellaire expressie wordt een knooppunt in de grafiek met eigenschappen die de kolomwaarden van de rij zijn. Knooppunten die worden weergegeven in de Edges tabel, maar geen overeenkomende rij in de Knooppunten tabel worden gemaakt als knooppunten met de bijbehorende knooppunt-id en lege eigenschappen.

Wanneer u de partitioned-by component gebruikt, worden afzonderlijke grafieken gemaakt voor elke unieke waarde in de opgegeven PartitionColumn. De opgegeven GraphOperator wordt vervolgens onafhankelijk toegepast op elke gepartitioneerde grafiek en de resultaten worden gecombineerd tot één uitvoer. Dit is met name handig voor scenario's met meerdere tenants waarbij u de gegevens van elke tenant afzonderlijk wilt analyseren terwijl u dezelfde grafiekstructuur- en analyselogica behoudt.

Belangrijk

Wanneer u de partitioned-by component gebruikt, moeten zowel de edges-tabel als alle knooppunttabellen de partitiekolom bevatten.

Notitie

Elk knooppunt heeft een unieke id. Als dezelfde knooppunt-id wordt weergegeven in de Nodes1 en Nodes2 tabellen, wordt één knooppunt gemaakt door de eigenschappen samen te voegen. Als er conflicterende eigenschapswaarden voor hetzelfde knooppunt zijn, wordt een van de waarden willekeurig gekozen.

Gebruikers kunnen op de volgende manieren knooppuntinformatie verwerken:

  1. Geen knooppuntgegevens vereist:make-graph is voltooid met bron en doel.
  2. Expliciete knooppunteigenschappen: maximaal twee tabellaire expressies gebruiken metwithNodes1onNodeId1 [,Nodes2onNodeId2 ]."
  3. Standaardknooppunt-id: gebruiken "with_node_id=DefaultNodeId."

Voorbeeld

Randen en knooppuntengrafiek

In het volgende voorbeeld wordt een grafiek gebouwd op basis van randen en knooppunttabellen. De knooppunten vertegenwoordigen personen en systemen en de randen vertegenwoordigen verschillende relaties tussen knooppunten. De operator make-graph bouwt de grafiek. Vervolgens wordt de operator graph-match gebruikt met een grafiekpatroon om te zoeken naar aanvalspaden die leiden naar het "Trent" systeemknooppunt.

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

uitvoer

Aanvaller Gecompromitteerd Systeem
Mallory Bob Trent

Standaardknooppunt-id

In het volgende voorbeeld wordt een grafiek gemaakt met alleen randen, waarbij de eigenschap name als standaardknooppunt-id wordt gebruikt. Deze methode is handig bij het maken van een grafiek op basis van een tabellaire expressie van randen, zodat de knooppunt-id beschikbaar is voor de sectie beperkingen van de volgende graph-match operator.

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

uitvoer

Aanvaller Gecompromitteerd Systeem
Mallory Bob Trent

Gepartitioneerde grafiek

In dit voorbeeld ziet u hoe u de partitioned-by component gebruikt om een sociaal netwerk met meerdere tenants te analyseren. De partitioned-by component maakt afzonderlijke grafieken voor elke unieke waarde in de partitiekolom (in dit geval tenantId), past de grafiekoperator onafhankelijk toe op elke partitie en combineert de resultaten.

Een diagram met drie verschillende bedrijven die drie verschillende partities vertegenwoordigen.

// 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 Huurders Einde
Bob Smith (CompanyA) [
"CompanyA",
"CompanyA"
]
Diana Finch (CompanyA)
Henry Davis (BedrijfB) [
"BedrijfB",
"BedrijfB"
]
Grace Lee (CompanyB)