Aracılığıyla paylaş


graf işleci yapma

Şunlar için geçerlidir: ✅Microsoft Fabric

işleci make-graph , kenarların ve düğümlerin tablosal girişlerinden bir grafik yapısı oluşturur.

Sözdizimi

Edges|make-graph SourceNodeId--> TargetNodeId [ withNode1on NodeId1 [,Node2onNodeId2 ]]

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

Kenar|make-graphSourceNodeId-->TargetNodeId [ withNode1onNodeId1 [,Node2on ]] partitioned-byPartitionColumn(GraphOperator)

Parametreler

Ad Tür Zorunlu Açıklama
Kenar string ✔️ Grafiğin kenarlarını içeren tablosal kaynak, her satır grafikteki bir kenarı temsil eder.
SourceNodeId string ✔️ Kenarların kaynak düğüm kimliklerine sahip Kenarlar'daki sütun.
TargetNodeId string ✔️ Kenarlardaki, kenarların hedef düğüm kimliklerine sahip sütun.
Düğümler1, Düğümler2 string Grafikteki düğümlerin özelliklerini içeren tablosal ifadeler.
NodeId1, NodeId2 string Sırasıyla Düğüm1, Düğümler2'de düğüm kimliklerine sahip ilgili sütunlar.
NodeIdPropertyName string Grafiğin düğümlerinde düğüm kimliği özelliğinin adı.
PartitionColumn string Grafiği bölümleme ölçütü olarak sütun. Bu sütundaki her benzersiz değer için ayrı grafikler oluşturur.
GraphOperator string Bölümlenmiş her grafiğe uygulanacak graf işleci.

Döndürülenler

işleci make-graph bir graf ifadesi döndürür ve bunu bir graf işleci takip etmelidir. Kaynak Kenarlar ifadesindeki her satır, satırın sütun değerleri olan özelliklere sahip grafikte bir kenar haline gelir. Düğümler tablosal ifadesindeki her satır, grafikte satırın sütun değerleri olan özelliklere sahip bir düğüm haline gelir. Edges tablosunda görünen ancak Düğümler tablosunda karşılık gelen bir satırı olmayan düğümler, karşılık gelen düğüm kimliğine ve boş özelliklere sahip düğümler olarak oluşturulur.

yan tümcesi partitioned-by kullanılırken, belirtilen PartitionColumn içindeki her benzersiz değer için ayrı grafikler oluşturulur. Belirtilen GraphOperator daha sonra bölümlenmiş her grafiğe bağımsız olarak uygulanır ve sonuçlar tek bir çıkışta birleştirilir. Bu, aynı grafik yapısını ve analiz mantığını korurken her kiracının verilerini ayrı ayrı analiz etmek istediğiniz çok kiracılı senaryolar için özellikle yararlıdır.

Önemli

yan tümcesini partitioned-by kullanırken hem Edges tablosu hem de tüm Düğümler tabloları bölüm sütununu içermelidir.

Not

Her düğümün benzersiz bir tanımlayıcısı vardır. Düğüm1 ve Düğüm2 tablolarında aynı düğüm kimliği görünüyorsa, özellikleri birleştirilerek tek bir düğüm oluşturulur. Aynı düğüm için çakışan özellik değerleri varsa, değerlerden biri rastgele seçilir.

Kullanıcılar düğüm bilgilerini aşağıdaki yollarla işleyebilir:

  1. Düğüm bilgisi gerekmez:make-graph kaynak ve hedefle tamamlar.
  2. Açık düğüm özellikleri: "withNode1 NodeId1 on [Node2 NodeId2,on]" kullanarak en fazla iki tablosal ifade kullanın.
  3. Varsayılan düğüm tanımlayıcısı: "with_node_id=DefaultNodeId" kullanın.

Örnek

Kenarlar ve düğümler grafiği

Aşağıdaki örnek kenarlardan ve düğüm tablolarından bir grafik oluşturur. Düğümler kişileri ve sistemleri, kenarlar ise düğümler arasındaki farklı ilişkileri temsil eder. operatör make-graph grafı oluşturur. Ardından işleç, sistem düğümüne graph-match giden saldırı yollarını aramak için grafik deseniyle "Trent" birlikte kullanılır.

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

Çıktı

Saldırgan Tehlikeye Sistem
Mallory Bob Trent

Varsayılan düğüm tanımlayıcısı

Aşağıdaki örnek, varsayılan düğüm tanımlayıcısı olarak özelliğiyle name yalnızca kenarları kullanan bir grafik oluşturur. Bu yaklaşım, kenarların tablosal ifadesinden grafik oluştururken kullanışlıdır ve sonraki graph-match işlecin kısıtlamalar bölümünde düğüm tanımlayıcısının kullanılabilir olduğundan emin olun.

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

Çıktı

Saldırgan Tehlikeye Sistem
Mallory Bob Trent

Bölümlenmiş grafik

Bu örnekte, çok kiracılı bir sosyal ağı analiz etmek için yan tümcesinin partitioned-by kullanılması gösterilmektedir. yan tümcesi partitioned-by , bölüm sütunundaki her benzersiz değer için ayrı grafikler oluşturur (bu örnekte, tenantId), grafik işlecini her bölüme bağımsız olarak uygular ve sonuçları birleştirir.

Üç farklı bölümü temsil eden üç farklı şirketi gösteren diyagram.

// 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 Kiracılar Son
Bob Smith (ŞirketA) [
"ŞirketA",
"ŞirketA"
]
Diana Finch (CompanyA)
Henry Davis (ŞirketB) [
"ŞirketB",
"ŞirketB"
]
Grace Lee (CompanyB)