Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Klasa sentinel_graph umożliwia interakcję z wykresem Microsoft Sentinel, umożliwiając definiowanie schematu grafu, przekształcanie danych z usługi Microsoft Sentinel data lake w węzły i krawędzie, publikowanie grafu, graf zapytań i uruchamianie zaawansowanych algorytmów grafów. Ta klasa jest przeznaczona do pracy z sesjami platformy Spark w notesach Jupyter działających na Microsoft Sentinel obliczeniach platformy Spark.
GraphSpecBuilder
Klasa GraphSpecBuilder zapewnia płynnego konstruktora do tworzenia specyfikacji grafu z potokami danych i integracją schematów.
Ważna
Alias GraphBuilder dla tej klasy jest przestarzały i zostanie usunięty w przyszłej wersji. Użyj we GraphSpecBuilder wszystkich nowych kodach.
# Deprecated — emits DeprecationWarning
from sentinel_graph.builders.graph_builder import GraphBuilder
# Recommended
from sentinel_graph import GraphSpecBuilder
Konstruktor
GraphSpecBuilder(context: ExecutionContext)
Parametry:
-
context(ExecutionContext): Kontekst wykonywania zawierający sesję i konfigurację platformy Spark
Podnosi:
-
ValueError: Jeśli kontekst ma wartość Brak lub nie można określić nazwy grafu
Metody statyczne
start
GraphSpecBuilder.start(context: Optional[ExecutionContext] = None) -> GraphSpecBuilder
Zdefiniuj nowego płynnego konstruktora wykresów.
Parametry:
-
context(ExecutionContext, opcjonalnie): Wystąpienie ExecutionContext. Jeśli nie, używa kontekstu domyślnego.
Zwraca:
-
GraphSpecBuilder: Nowe wystąpienie konstruktora
Przykład:
builder = GraphSpecBuilder.start(context=context)
Metody wystąpień
add_node
def add_node(alias: str) -> NodeBuilderInitial
Rozpocznij tworzenie definicji węzła.
Parametry:
-
alias(str): Unikatowy identyfikator tego węzła w grafie
Zwraca:
-
NodeBuilderInitial: Konstruktor węzłów w stanie początkowym
Przykład:
builder.add_node("user")
add_edge
def add_edge(alias: str) -> EdgeBuilderInitial
Rozpocznij tworzenie definicji krawędzi.
Parametry:
-
alias(str): Identyfikator tej krawędzi w grafie (może być współużytkowany na wielu krawędziach)
Zwraca:
-
EdgeBuilderInitial: Konstruktor krawędzi w stanie początkowym
Przykład:
builder.add_edge("accessed")
done
def done() -> GraphSpec
Finalizowanie specyfikacji grafu i zwracanie wystąpienia GraphSpec.
Zwraca:
-
GraphSpec: Ukończ specyfikację grafu za pomocą potoku danych i schematu
Podnosi:
-
ValueError: Jeśli wykres nie ma węzłów ani krawędzi lub jeśli weryfikacja zakończy się niepowodzeniem
Przykład:
graph_spec = builder.done()
GraphSpec
Specyfikacja grafu z możliwościami potoku danych, schematu i wyświetlania.
Konstruktor
GraphSpec(
name: str,
context: ExecutionContext,
graph_schema: GraphSchema,
etl_pipeline: Optional[ETLPipeline] = None
)
Parametry:
-
name(str): Nazwa grafu -
context(ExecutionContext): Kontekst wykonywania -
graph_schema(GraphSchema): definicja schematu grafu -
etl_pipeline(ETLPipeline, opcjonalnie): potok danych na potrzeby przygotowywania grafu
Właściwości
nodes
def nodes() -> DataFrame
Pobierz element DataFrame węzłów (z opóźnieniem, buforowany). Automatycznie określa źródło na podstawie potoku danych lub tabeli lake.
Zwraca:
-
DataFrame: Ramka danych platformy Spark zawierająca wszystkie węzły
Podnosi:
-
ValueError: Jeśli brakuje kontekstu lub nie można załadować ramek danych
edges
def edges() -> DataFrame
Pobierz ramkę danych krawędzi (z opóźnieniem, buforowane). Automatycznie określa źródło na podstawie potoku danych lub tabeli lake.
Zwraca:
-
DataFrame: Ramka danych platformy Spark zawierająca wszystkie krawędzie
Podnosi:
-
ValueError: Jeśli brakuje kontekstu lub nie można załadować ramek danych
Metody
build_graph_with_data
Uwaga
build_graph_with_data jest przestarzałe i zostanie usunięte w przyszłej wersji.
Zamiast tego użyj.Graph.build(spec)
def build_graph_with_data() -> Dict[str, Any]
Wykonaj potok danych i opublikuj graf.
Wewnętrznie wywołuje Graph.build(self)element , schowa zwrócony Graphsłownik i zwraca słownik zgodny z poprzednimi wersjami.
Zwraca:
-
Dict[str, Any]: Słownik zawierający:-
etl_result: Wyniki przygotowywania danych -
api_result: Publikowanie wyników (jeśli się powiedzie) -
api_error: Ciąg błędu (jeśli publikowanie nie powiodło się) -
instance_name: Nazwa wystąpienia grafu -
status:"published"lub"prepared"
-
Przykład:
graph = Graph.build(spec)
print(f"Status: {graph.build_status.status}")
get_schema
def get_schema() -> GraphSchema
Pobierz schemat grafu.
Zwraca:
-
GraphSchema: Definicja schematu grafu
get_pipeline
Uwaga
Ta metoda jest przestarzała i zostanie usunięta w przyszłej wersji. Potok danych jest wewnętrznym szczegółem implementacji i nie powinien być dostępny bezpośrednio.
def get_pipeline() -> Optional[ETLPipeline]
Pobierz potok danych (Brak dla istniejących grafów).
Zwraca:
-
ETLPipelinelubNone: Potok danych, jeśli jest dostępny
to_graphframe
def to_graphframe(column_mapping: Optional[Dict[str, str]] = None) -> GraphFrame
Konwertuj cały graf na element GraphFrame na potrzeby uruchamiania algorytmów grafów. Działa tylko na danych lokalnych (z potoku danych lub tabeli lake).
Parametry:
-
column_mapping(Dict[str, str], opcjonalnie): Niestandardowe mapowanie kolumn za pomocą kluczy:-
"id": Nazwa kolumny identyfikatora wierzchołka -
"source_id": Nazwa kolumny identyfikatora źródła krawędzi -
"target_id": Nazwa kolumny docelowego identyfikatora krawędzi
-
Zwraca:
-
GraphFrame: obiekt GraphFrame ze wszystkimi wierzchołkami i krawędziami
Podnosi:
-
ValueError: Jeśli funkcja ExecutionContext nie jest dostępna
Przykład:
gf = graph_spec.to_graphframe()
pagerank = gf.pageRank(resetProbability=0.15, maxIter=10)
show
def show(limit: int = 100, viz_format: str = "visual") -> None
Wyświetlanie danych grafu w różnych formatach.
Parametry:
-
limit(int, default=100): maksymalna liczba węzłów/krawędzi do wyświetlenia -
viz_format(str, default="visual"): format danych wyjściowych-
"table": Pełne tabele ramek danych (wszystkie kolumny) -
"visual": Interaktywna wizualizacja grafu -
"all": Pokaż wszystkie formaty
-
Podnosi:
-
ValueError: Jeśli format nie jest jedną z obsługiwanych wartości
Przykład:
graph_spec.show(limit=50, viz_format="table")
show_schema
def show_schema() -> None
Wyświetlanie schematu grafu jako interaktywnej wizualizacji grafu.
Przykład:
spec.show_schema()
Graph
Wystąpienie grafu z możliwością wykonywania zapytań. Utworzone za pośrednictwem Graph.get() (istniejącego grafu) lub Graph.build() (na podstawie GraphSpecelementu ).
Konstruktor
Graph(
name: str,
context: ExecutionContext,
spec: Optional[GraphSpec] = None,
build_status: Optional[BuildStatus] = None,
)
Parametry:
-
name(str): Nazwa grafu -
context(ExecutionContext): Kontekst wykonywania -
spec(GraphSpec, opcjonalnie): Dołączona specyfikacja grafu (ustawiona przezGraph.build()) -
build_status(BuildStatus, opcjonalnie): Metadane wyników kompilacji (ustawione przezGraph.build())
Podnosi:
-
ValueError: Jeśli parametr ExecutionContext to Brak
Metody statyczne
get
Graph.get(name: str, context: Optional[ExecutionContext] = None) -> Graph
Pobieranie wystąpienia grafu z istniejącego grafu.
Zwrócone elementy Graph mają spec=None wartości i build_status=None.
Parametry:
-
name(str): Nazwa wystąpienia grafu -
context(ExecutionContext, opcjonalnie): Kontekst wykonywania (domyślnie ExecutionContext.default())
Zwraca:
-
Graph: Wystąpienie programu Graph
Podnosi:
-
ValueError: Jeśli nazwa grafu jest pusta lub wystąpienie grafu nie istnieje
Przykład:
graph = Graph.get("my_graph", context=context)
graph.query("MATCH (n) RETURN n")
prepare
Graph.prepare(spec: GraphSpec) -> Graph
Uruchom etap przygotowywania danych dla GraphSpec elementu bez publikowania. Użyj później publish() , aby zarejestrować graf i umożliwić wykonywanie zapytań.
Parametry:
-
spec(GraphSpec): specyfikacja grafu do przygotowania
Zwraca:
-
Graph: wystąpienie grafu zspecdołączonymi ibuild_status.status == "prepared"
Podnosi:
-
ValueError: jeśli specyfikacja nie ma potoku danych lub nie ma kontekstu wykonywania -
RuntimeError: Jeśli wykonanie potoku danych zakończy się niepowodzeniem
Przykład:
spec = GraphSpecBuilder.start(context=ctx).add_node(...).done()
graph = Graph.prepare(spec)
# Inspect results before publishing
graph.nodes.show()
graph.publish()
graph.query("MATCH (n) RETURN n")
build
Graph.build(spec: GraphSpec) -> Graph
Skompiluj wykres na podstawie elementu , GraphSpec przygotowując dane i publikując. Wewnętrznie wywołuje, Graph.prepare(spec) a następnie próbuje graph.publish(). W przeciwieństwie do wywoływania tych dwóch metod oddzielnie, błędy publikowania są przechwytywany — zwracany graf ma build_status.status == "prepared" i build_status.api_error ustawia zamiast podnoszenia.
Parametry:
-
spec(GraphSpec): specyfikacja grafu do skompilowania na podstawie
Zwraca:
-
Graph: Wystąpienie grafu zspecdołączonym ibuild_statuswypełnionym
Podnosi:
-
ValueError: jeśli specyfikacja nie ma potoku danych lub nie ma kontekstu wykonywania -
RuntimeError: Jeśli wykonanie potoku danych zakończy się niepowodzeniem
Przykład:
spec = GraphSpecBuilder.start(context=ctx).add_node(...).done()
graph = Graph.build(spec)
print(graph.build_status.status) # "published" or "prepared" (None if neither ran)
graph.query("MATCH (n) RETURN n")
Właściwości
nodes
def nodes() -> Optional[DataFrame]
Pobierz element DataFrame węzłów. Deleguje do self.spec.nodes , gdy specyfikacja jest dołączona; zwraca None inaczej.
edges
def edges() -> Optional[DataFrame]
Pobierz ramkę danych krawędzi. Deleguje do self.spec.edges , gdy specyfikacja jest dołączona; zwraca None inaczej.
schema
def schema() -> Optional[GraphSchema]
Pobierz schemat grafu. Deleguje do self.spec.get_schema() , gdy specyfikacja jest dołączona; zwraca None inaczej.
Metody
query
def query(query_string: str, query_language: str = "GQL") -> QueryResult
Wykonaj zapytanie względem wystąpienia grafu przy użyciu protokołu GQL.
Parametry:
-
query_string(str): ciąg zapytania grafu (język GQL) -
query_language(str, default="GQL"): język zapytań
Zwraca:
-
QueryResult: obiekt zawierający węzły, krawędzie i metadane
Podnosi:
-
ValueError: Jeśli brakuje sesji ExecutionContext lub Spark -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Przykład:
result = graph.query("MATCH (u:user) WHERE u.age > 30 RETURN u")
result.show()
reachability
def reachability(
*,
source_property_value: str = None,
target_property_value: str = None,
source_property: Optional[str] = None,
participating_source_node_labels: Optional[List[str]] = None,
target_property: Optional[str] = None,
participating_target_node_labels: Optional[List[str]] = None,
participating_edge_labels: Optional[List[str]] = None,
is_directional: bool = True,
min_hop_count: int = 1,
max_hop_count: int = 4,
shortest_path: bool = False,
max_results: int = 500
) -> QueryResult
[! UWAGA]
reachability(query_input=ReachabilityQueryInput(...))jest nadal akceptowana, ale emitujeDeprecationWarningi zostanie usunięta w przyszłej wersji.
Wykonaj analizę dostępności między węzłami źródłowym i docelowym.
Parametry:
-
source_property_value(str): Wartość zgodna z właściwością źródłową (zweryfikowana w czasie wykonywania. Należy podano, jeśli nie używasz programuquery_input) -
target_property_value(str): Wartość zgodna z właściwością docelową (zweryfikowana w czasie wykonywania. Należy podano, jeśli nie używasz programuquery_input) -
source_property(Opcjonalnie[str]): nazwa właściwości do filtrowania węzłów źródłowych -
participating_source_node_labels(Opcjonalnie[Lista[str]]): Etykiety węzłów do rozważenia jako źródła -
target_property(Opcjonalnie[str]): nazwa właściwości do filtrowania węzłów docelowych -
participating_target_node_labels(Opcjonalnie[Lista[str]]): etykiety węzłów do rozważenia jako elementy docelowe -
participating_edge_labels(Opcjonalnie[Lista[str]]): Etykiety krawędzi do przejścia -
is_directional(bool): Czy krawędzie są kierunkowe (domyślnie:True) -
min_hop_count(int): minimalne przeskoki (domyślnie:1) -
max_hop_count(int): maksymalna liczba przeskoków (wartość domyślna:4) -
shortest_path(bool): Zwracaj tylko najkrótsze ścieżki (domyślnie:False) -
max_results(int): maksymalna liczba wyników (wartość domyślna:500)
Podnosi:
-
ValueError: Jeślisource_property_valuebrakuje lubtarget_property_value, ,min_hop_count < 1max_hop_count < min_hop_count, lubmax_results < 1 -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Zwraca:
-
QueryResult: zawiera ścieżki osiągalności
Przykład:
result = graph.reachability(
source_property_value="user-001",
target_property_value="device-003")
result.show()
k_hop
def k_hop(
*,
source_property: Optional[str] = None,
source_property_value: Optional[str] = None,
participating_source_node_labels: Optional[List[str]] = None,
target_property: Optional[str] = None,
target_property_value: Optional[str] = None,
participating_target_node_labels: Optional[List[str]] = None,
participating_edge_labels: Optional[List[str]] = None,
is_directional: bool = True,
min_hop_count: int = 1,
max_hop_count: int = 4,
shortest_path: bool = False,
max_results: int = 500
) -> QueryResult
Uwaga
k_hop(query_input=K_HopQueryInput(...)) jest nadal akceptowane, ale emituje DeprecationWarning i zostanie usunięte w przyszłej wersji.
Wykonaj analizę k-hopu z danego węzła źródłowego.
Parametry:
- Tak samo jak
reachability
Sprawdzania poprawności:
- Co najmniej jeden z
source_property_valuelubtarget_property_valuemusi zostać dostarczony
Podnosi:
-
ValueError: Jeśli nie podano ani niesource_property_valuetarget_property_valuepodano ograniczeń liczbowych (tak samo jakreachability) -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Zwraca:
-
QueryResult: Zawiera wyniki k-hopu
Przykład:
result = graph.k_hop(source_property_value="user-001")
result.show()
blast_radius
def blast_radius(
*,
source_property_value: str = None,
target_property_value: str = None,
source_property: Optional[str] = None,
participating_source_node_labels: Optional[List[str]] = None,
target_property: Optional[str] = None,
participating_target_node_labels: Optional[List[str]] = None,
participating_edge_labels: Optional[List[str]] = None,
is_directional: bool = True,
min_hop_count: int = 1,
max_hop_count: int = 4,
shortest_path: bool = False,
max_results: int = 500
) -> QueryResult
Uwaga
blast_radius(query_input=BlastRadiusQueryInput(...)) jest nadal akceptowane, ale emituje DeprecationWarning i zostanie usunięte w przyszłej wersji.
Wykonaj analizę promienia wybuchu z węzła źródłowego do węzła docelowego.
Parametry:
-
source_property_value(str): Wartość identyfikująca węzeł źródłowy (zweryfikowana w czasie wykonywania. Należy podano, jeśli nie używasz programuquery_input) -
target_property_value(str): Wartość identyfikująca węzeł docelowy (zweryfikowana w czasie wykonywania. Należy podano, jeśli nie używasz programuquery_input) - Inne parametry: takie same jak
reachability
Podnosi:
-
ValueError: jeślisource_property_valuebrakuje lubtarget_property_valuelub jeśli naruszono ograniczenia liczbowe (takie same jakreachability) -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Zwraca:
-
QueryResult: Zawierające wyniki promienia wybuchu
Przykład:
result = graph.blast_radius(
source_property_value="user-003",
target_property_value="device-003",
min_hop_count=1)
result.show()
centrality
def centrality(
*,
participating_source_node_labels: Optional[List[str]] = None,
participating_target_node_labels: Optional[List[str]] = None,
participating_edge_labels: Optional[List[str]] = None,
threshold: int = 3,
centrality_type: CentralityType = None,
max_paths: int = 1000000,
is_directional: bool = True,
min_hop_count: int = 1,
max_hop_count: int = 4,
shortest_path: bool = False,
max_results: int = 500
) -> QueryResult
Uwaga
centrality(query_input=CentralityQueryInput(...)) jest nadal akceptowane, ale emituje DeprecationWarning i zostanie usunięte w przyszłej wersji.
Przeprowadzanie analizy centralności na wykresie.
Parametry:
-
participating_source_node_labels(Opcjonalnie[Lista[str]]): Etykiety węzłów źródłowych -
participating_target_node_labels(Opcjonalnie[Lista[str]]): Etykiety węzłów docelowych -
participating_edge_labels(Opcjonalnie[Lista[str]]): Etykiety krawędzi do przejścia -
threshold(int): Minimalna ocena centralności (domyślna:3); musi być nieujemna -
centrality_type(CentralityType):CentralityType.NodelubCentralityType.Edge(domyślnie:None, wraca doCentralityType.Node) -
max_paths(int): Maksymalna liczba ścieżek do rozważenia (wartość domyślna:1000000;0= wszystkie ścieżki); musi być nieujemna -
is_directional(bool): Czy krawędzie są kierunkowe (domyślnie:True) -
min_hop_count(int): Minimalne przeskoki (domyślne:1); muszą być ≥ 1 -
max_hop_count(int): maksymalna liczba przeskoków (wartość domyślna:4); musi być ≥min_hop_count -
shortest_path(bool): Zwracaj tylko najkrótsze ścieżki (domyślnie:False) -
max_results(int): Maksymalna liczba wyników (wartość domyślna:500); musi być ≥ 1
Podnosi:
-
ValueError: Jeślithreshold < 0,max_paths < 0,min_hop_count < 1, ,max_hop_count < min_hop_countlubmax_results < 1 -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Zwraca:
-
QueryResult: Zawierające metryki centralności
Przykład:
result = graph.centrality(
participating_source_node_labels=["user", "device"],
participating_target_node_labels=["device", "user"],
participating_edge_labels=["sign_in"],
is_directional=False)
result.show()
ranked
def ranked(
*,
rank_property_name: str = None,
threshold: int = 0,
max_paths: int = 1000000,
decay_factor: float = 1,
is_directional: bool = True,
min_hop_count: int = 1,
max_hop_count: int = 4,
shortest_path: bool = False,
max_results: int = 500
) -> QueryResult
Uwaga
ranked(query_input=RankedQueryInput(...)) jest nadal akceptowane, ale emituje DeprecationWarning i zostanie usunięte w przyszłej wersji.
Przeprowadzanie analizy rankingowej na wykresie.
Parametry:
-
rank_property_name(str): Nazwa właściwości do użycia na potrzeby klasyfikacji (zweryfikowana w czasie wykonywania. Należy podano, jeśli nie używasz programuquery_input) -
threshold(int): Tylko ścieżki zwracane powyżej tej wagi (domyślnie:0); muszą być nieujemne -
max_paths(int): Maksymalna liczba ścieżek do rozważenia (wartość domyślna:1000000;0= wszystkie ścieżki); musi być nieujemna -
decay_factor(zmiennoprzecinkowa): klasyfikacja rozkładu na krok; 2 oznacza zmniejszenie o połowę (wartość domyślna:1); musi być nieujemna -
is_directional(bool): Czy krawędzie są kierunkowe (domyślnie:True) -
min_hop_count(int): Minimalne przeskoki (domyślne:1); muszą być ≥ 1 -
max_hop_count(int): maksymalna liczba przeskoków (wartość domyślna:4); musi być ≥min_hop_count -
shortest_path(bool): Zwracaj tylko najkrótsze ścieżki (domyślnie:False) -
max_results(int): Maksymalna liczba wyników (wartość domyślna:500); musi być ≥ 1
Podnosi:
-
ValueError: Jeślirank_property_namebrakuje, ,threshold < 0,max_paths < 0decay_factor < 0,min_hop_count < 1, ,max_hop_count < min_hop_count, lubmax_results < 1 -
RuntimeError: Jeśli inicjowanie klienta lub wykonanie zapytania zakończy się niepowodzeniem
Zwraca:
-
QueryResult: Zawiera węzły/krawędzie sklasyfikowane
Przykład:
result = graph.ranked(
rank_property_name="risk_score",
threshold=5,
decay_factor=2)
result.show()
to_graphframe
def to_graphframe(column_mapping: Optional[Dict[str, str]] = None) -> GraphFrame
Konwertuj cały graf na element GraphFrame. Używa danych specyfikacji, jeśli są dostępne; odczyty z tabel lake w przeciwnym razie.
Parametry:
-
column_mapping(Dict[str, str], opcjonalnie): Mapowanie kolumn niestandardowych
Zwraca:
-
GraphFrame: obiekt GraphFrame ze wszystkimi wierzchołkami i krawędziami
Przykład:
gf = graph.to_graphframe()
show
def show() -> None
Wyświetl informacje o grafie. Deleguje do spec.show() wyświetlania rozbudowanego, gdy specyfikacja jest dołączona; w przeciwnym razie wyświetla minimalne informacje.
show_schema
def show_schema() -> None
Wyświetlanie schematu grafu. Deleguje do spec.show_schema() , gdy specyfikacja jest dołączona; wyświetla komunikat wskazujący, że żaden schemat nie jest dostępny w przeciwnym razie.
publish
(nowość w wersji 0.3.3)
def publish() -> Graph
Zarejestruj wykres przy użyciu interfejsu API, dzięki czemu można wykonywać zapytania. Wywołaj tę metodę po Graph.prepare() (lub na dowolnym Graph , który ma dołączoną specyfikację), aby opublikować wystąpienie grafu.
Zwraca:
-
Graph: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli nie jest dołączona żadna specyfikacja lub brakuje kontekstu -
RuntimeError: Jeśli publikowanie zakończy się niepowodzeniem
Przykład:
graph = Graph.prepare(spec)
graph.publish()
# Now the graph is queryable
graph.query("MATCH (n) RETURN n")
BuildStatus
Klasa danych z metadanymi z Graph.build() operacji.
Pola
| Pole | Typ | Opis |
|---|---|---|
etl_result |
Any |
Wynik z prepare etapu (wykonywanie potoku danych) |
api_result |
Optional[Dict] |
Wynik z etapu publikowania (None jeśli publikowanie nie powiodło się) |
api_error |
Optional[str] |
Komunikat o błędzie, jeśli publikowanie nie powiodło się (None jeśli publikowanie zakończyło się pomyślnie) |
instance_name |
str |
Nazwa wystąpienia grafu |
status |
Optional[BuildStatusKind] |
None, , "published"lub "prepared" |
Ścieżki konstrukcyjne
GraphSpecBuilder.start(...).done() → GraphSpec (spec only, no graph yet)
Graph.get(name, context) → Graph (spec=None, build_status=None)
Graph.prepare(spec) → Graph (spec=spec, build_status.status="prepared")
graph.publish() → Graph (build_status.status="published")
Graph.build(spec) → Graph (prepare + publish in one step)
Przykład:
graph = Graph.build(spec)
if graph.build_status.status == "published":
print("Graph prepared and published successfully")
elif graph.build_status.status == "prepared":
print(f"Prepare succeeded but publish failed: {graph.build_status.api_error}")
elif graph.build_status.status is None:
print("Neither prepare nor publish has run")
Konstruktorzy węzłów
NodeBuilderInitial
Stan początkowy konstruktora węzłów: dostępne są tylko metody źródła danych.
Konstruktor
NodeBuilderInitial(alias: str, graph_builder: GraphSpecBuilder)
Uwaga: Zazwyczaj tworzone za pośrednictwem GraphSpecBuilder.add_node()programu , nie są tworzone bezpośrednio.
Metody
Uwaga
Użycie podkreślenia _ podczas nazewnictwa węzłów, krawędzi lub właściwości na wykresie niestandardowym nie jest obsługiwane. Gdy są używane podkreślenia, zwracany jest nieprawidłowy błąd żądania.
from_table
def from_table(self, table_name: str, database: Optional[str] = None, time_generated_start: Optional[str] = None, time_generated_end: Optional[str] = None) -> NodeBuilderSourceSet
Ustaw tabelę jako źródło danych z inteligentną rozdzielczością bazy danych.
Parametry:
-
table_name(str): Nazwa tabeli (wymagana) -
database(str, opcjonalnie): jawna nazwa bazy danych (ma pierwszeństwo przed domyślnym kontekstem) -
time_generated_start(str, optional) itime_generated_end(str, optional): Opcjonalne pola sygnatury czasowej, gdy są używane razem aktywuje zoptymalizowane odczyty różnicowe. Zalecamy użycie formy kanonicznej: "rrrr-MM-dd HH:mm:ss".
Zwraca:
-
NodeBuilderSourceSet: Konstruktor do dalszej konfiguracji
Podnosi:
-
ValueError: Jeśli nie znaleziono tabeli lub znaleziono wiele tabel powodujących konflikt
Kolejność rozpoznawania bazy danych:
- Parametr jawny
database(najwyższy priorytet) - ExecutionContext.default_database
- Przeszukaj wszystkie bazy danych (z wykrywaniem konfliktów)
Przykład:
end = datetime.now(timezone.utc)
start = end - timedelta(hours=24)
builder.add_node("user").from_table("SigninLogs", database="security_db", time_generated_start = start, time_generated_end = end)
from_dataframe
def from_dataframe(dataframe: DataFrame) -> NodeBuilderSourceSet
Ustaw element Spark DataFrame jako źródło danych.
Parametry:
-
dataframe(DataFrame): Ramka danych platformy Spark
Zwraca:
-
NodeBuilderSourceSet: Konstruktor do dalszej konfiguracji
Przykład:
# For Standard Read
df = spark.read.table("users", WORKSPACE_NAME)
# Optional Optimized Read - You could use the below pattern to activate Optimized Delta Reading
end = datetime.now(timezone.utc)
start = end - timedelta(hours=24)
df = spark.read.table("users", WORKSPACE_NAME, time_generated_start = start, time_generated_end = end )
builder.add_node("user").from_dataframe(df)
NodeBuilderSourceSet
Konstruktor węzłów po ustawieniu źródła danych: dostępne metody konfiguracji.
Konstruktor
NodeBuilderSourceSet(alias: str, graph_builder: GraphSpecBuilder, source_step: DataInputETLStep)
Uwaga: Utworzone wewnętrznie przez metody źródłowe NodeBuilderInitial.
Metody
with_time_range
def with_time_range(
time_column: str,
start_time: Optional[Union[str, datetime]] = None,
end_time: Optional[Union[str, datetime]] = None,
lookback_hours: Optional[float] = None
) -> NodeBuilderSourceSet
Zastosuj filtrowanie zakresu czasu do źródła danych węzła.
Parametry:
-
time_column(str): Nazwa kolumny zawierająca dane sygnatury czasowej (wymagane) -
start_time(str lub datetime, opcjonalnie): data rozpoczęcia ("10/20/25", "2025-10-20" lub obiekt datetime) -
end_time(str lub datetime, opcjonalnie): data zakończenia (takie same formaty jak start_time) -
lookback_hours(zmiennoprzecinkowa, opcjonalna): godziny do obejrzenia od teraz
Zwraca:
-
NodeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli kolumna czasu nie została znaleziona w schemacie źródłowym
Logika zakresu czasu:
- Jeśli podano start_time i end_time: użyj ich bezpośrednio
- Jeśli podano tylko lookback_hours: end=now, start=now-lookback_hours
- Jeśli nie podano żadnych informacji: brak filtrowania czasu
- Jeśli początek/koniec I lookback_hours: początek/koniec mają pierwszeństwo
Przykład:
# Explicit date range
builder.add_node("user").from_table("SigninLogs") \
.with_time_range(time_column="TimeGenerated", start_time="2025-01-01", end_time="2025-01-31")
# Lookback window
builder.add_node("user").from_table("SigninLogs") \
.with_time_range(time_column="TimeGenerated", lookback_hours=24)
with_label
def with_label(label: str) -> NodeBuilderSourceSet
Ustaw etykietę węzła (domyślnie alias, jeśli nie jest wywoływany).
Parametry:
-
label(str): Etykieta węzła
Zwraca:
-
NodeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli etykieta została już ustawiona
Przykład:
builder.add_node("u").from_table("Users").with_label("user")
with_columns
def with_columns(
*columns: str,
key: str,
display: str
) -> NodeBuilderSourceSet
Skonfiguruj kolumny z wymaganym kluczem i oznaczeniem wyświetlania.
Parametry:
-
*columns(str): Nazwy kolumn do uwzględnienia (co najmniej jeden wymagany) -
key(str): Nazwa kolumny, aby oznaczyć jako klucz (wymagane, musi być w kolumnach) -
display(str): Nazwa kolumny, aby oznaczyć jako wartość wyświetlaną (wymagane, musi być w kolumnach, może być taka sama jak klucz)
Zwraca:
-
NodeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli weryfikacja zakończy się niepowodzeniem (zduplikowane kolumny, brak klucza/wyświetlacza itp.)
Uwagi:
Właściwości są automatycznie kompilowane na podstawie typów kolumn
Kolumna filtru czasu jest dodawana automatycznie, jeśli zostanie określona
Typy właściwości są automatycznie wnioskowane ze schematu źródłowego
Zobacz Ograniczenia
Przykład:
builder.add_node("user").from_table("Users") \
.with_columns("id", "name", "email", "created_at", key="id", display="name")
add_node
def add_node(alias: str) -> NodeBuilderInitial
Zakończ ten węzeł i rozpocznij tworzenie innego węzła.
Parametry:
-
alias(str): Alias nowego węzła
Zwraca:
-
NodeBuilderInitial: Nowy konstruktor węzłów
Przykład:
builder.add_node("user").from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.add_node("device")
add_edge
def add_edge(alias: str) -> EdgeBuilderInitial
Zakończ ten węzeł i rozpocznij tworzenie krawędzi.
Parametry:
-
alias(str): alias krawędzi
Zwraca:
-
EdgeBuilderInitial: Nowy konstruktor krawędzi
Przykład:
builder.add_node("user").from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.add_edge("accessed")
done
def done() -> GraphSpec
Zakończ ten węzeł i wypełnij specyfikację grafu.
Zwraca:
-
GraphSpec: Kompletna specyfikacja grafu
Przykład:
graph_spec = builder.add_node("user").from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.done()
Konstruktorzy krawędzi
EdgeBuilderInitial
Stan początkowy konstruktora krawędzi: dostępne są tylko metody źródła danych.
Konstruktor
EdgeBuilderInitial(alias: str, graph_builder: GraphSpecBuilder)
Uwaga: Zazwyczaj tworzone za pośrednictwem GraphSpecBuilder.add_edge()programu , nie są tworzone bezpośrednio.
Metody
Uwaga
Użycie podkreślenia _ podczas nazewnictwa węzłów, krawędzi lub właściwości na wykresie niestandardowym nie jest obsługiwane. Gdy są używane podkreślenia, zwracany jest nieprawidłowy błąd żądania.
from_table
def from_table(table_name: str, database: Optional[str] = None) -> EdgeBuilderSourceSet
Ustaw tabelę jako źródło danych z inteligentną rozdzielczością bazy danych.
Parametry:
-
table_name(str): Nazwa tabeli (wymagana) -
database(str, opcjonalnie): jawna nazwa bazy danych
Zwraca:
-
EdgeBuilderSourceSet: Konstruktor do dalszej konfiguracji
Podnosi:
-
ValueError: Jeśli nie znaleziono tabeli lub znaleziono wiele tabel powodujących konflikt
Przykład:
builder.add_edge("accessed").from_table("AccessLogs")
from_dataframe
def from_dataframe(dataframe: DataFrame) -> EdgeBuilderSourceSet
Ustaw element Spark DataFrame jako źródło danych.
Parametry:
-
dataframe(DataFrame): Ramka danych platformy Spark
Zwraca:
-
EdgeBuilderSourceSet: Konstruktor do dalszej konfiguracji
Przykład:
df = spark.read.table("access_logs")
builder.add_edge("accessed").from_dataframe(df)
EdgeBuilderSourceSet
Konstruktor edge po ustawieniu źródła danych: dostępne metody konfiguracji.
Konstruktor
EdgeBuilderSourceSet(alias: str, graph_builder: GraphSpecBuilder, source_step: DataInputETLStep)
Uwaga: Utworzone wewnętrznie przez metody źródłowe EdgeBuilderInitial.
Metody
with_label
def with_label(label: str) -> EdgeBuilderSourceSet
Ustaw typ/etykietę relacji krawędzi (domyślnie alias, jeśli nie jest wywoływany).
Parametry:
-
label(str): Etykieta krawędzi
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli etykieta została już ustawiona
Przykład:
builder.add_edge("rel").from_table("AccessLogs").with_label("ACCESSED")
edge_label
Uwaga
Zamiast tego użyj.with_label() Ta metoda zostanie usunięta w przyszłej wersji.
def edge_label(label: str) -> EdgeBuilderSourceSet
Ustaw typ/etykietę relacji krawędzi (domyślnie alias, jeśli nie jest wywoływany).
Parametry:
-
label(str): Etykieta krawędzi
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli etykieta została już ustawiona
Przykład:
builder.add_edge("acc").from_table("AccessLogs").edge_label("accessed")
source
def source(id_column: str, node_type: str) -> EdgeBuilderSourceSet
Ustaw węzeł źródłowy z kolumną i etykietą identyfikatora.
Parametry:
-
id_column(str): Nazwa kolumny zawierająca identyfikator węzła źródłowego -
node_type(str): Etykieta węzła źródłowego
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli źródło zostało już ustawione
Przykład:
builder.add_edge("accessed").from_table("AccessLogs") \
.source(id_column="user_id", node_type="user")
target
def target(id_column: str, node_type: str) -> EdgeBuilderSourceSet
Ustaw węzeł docelowy z kolumną i etykietą identyfikatora.
Parametry:
-
id_column(str): Nazwa kolumny zawierająca identyfikator węzła docelowego -
node_type(str): Etykieta węzła docelowego
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli obiekt docelowy został już ustawiony
Przykład:
builder.add_edge("accessed").from_table("AccessLogs") \
.source(id_column="user_id", node_type="user") \
.target(id_column="device_id", node_type="device")
with_time_range
def with_time_range(
time_column: str,
start_time: Optional[Union[str, datetime]] = None,
end_time: Optional[Union[str, datetime]] = None,
lookback_hours: Optional[float] = None
) -> EdgeBuilderSourceSet
Zastosuj filtrowanie zakresu czasu do źródła danych krawędzi.
Parametry:
-
time_column(str): Nazwa kolumny zawierająca dane sygnatury czasowej (wymagane) -
start_time(str lub datetime, opcjonalnie): data rozpoczęcia -
end_time(str lub datetime, opcjonalnie): data zakończenia -
lookback_hours(zmiennoprzecinkowa, opcjonalna): godziny do obejrzenia od teraz
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli kolumna czasu nie została znaleziona w schemacie źródłowym
Przykład:
builder.add_edge("accessed").from_table("AccessLogs") \
.with_time_range(time_column="TimeGenerated", lookback_hours=48)
with_columns
def with_columns(
*columns: str,
key: str,
display: str
) -> EdgeBuilderSourceSet
Skonfiguruj kolumny z wymaganym kluczem i oznaczeniem wyświetlania.
Parametry:
-
*columns(str): Nazwy kolumn do uwzględnienia (co najmniej jeden wymagany) -
key(str): Nazwa kolumny, aby oznaczyć jako klucz (wymagane, musi być w kolumnach) -
display(str): Nazwa kolumny, aby oznaczyć jako wartość wyświetlaną (wymagane, musi być w kolumnach)
Zwraca:
-
EdgeBuilderSourceSet: Samodzielne tworzenie łańcuchów metod
Podnosi:
-
ValueError: Jeśli weryfikacja nie powiedzie się
Przykład:
builder.add_edge("accessed").from_table("AccessLogs") \
.source(id_column="user_id", node_type="user") \
.target(id_column="device_id", node_type="device") \
.with_columns("id", "location", "status", key="id", display="location")
add_node
def add_node(alias: str) -> NodeBuilderInitial
Zakończ tę krawędź i rozpocznij tworzenie węzła.
Parametry:
-
alias(str): Alias nowego węzła
Zwraca:
-
NodeBuilderInitial: Nowy konstruktor węzłów
add_edge
def add_edge(alias: str) -> EdgeBuilderInitial
Zakończ tę krawędź i zacznij tworzyć kolejną krawędź.
Parametry:
-
alias(str): alias nowej krawędzi
Zwraca:
-
EdgeBuilderInitial: Nowy konstruktor krawędzi
Przykład:
builder.add_edge("accessed").from_table("AccessLogs") \
.source(id_column="user_id", node_type="user") \
.target(id_column="device_id", node_type="device") \
.with_columns("id", "location", key="id", display="location") \
.add_edge("connected_to")
done
def done() -> GraphSpec
Sfinalizuj tę krawędź i wypełnij specyfikację grafu.
Zwraca:
-
GraphSpec: Kompletna specyfikacja grafu
Klasy schematów
GraphDefinitionReference
Odwołanie do definicji grafu o nazwie i wersji.
Konstruktor
GraphDefinitionReference(
fully_qualified_name: str,
version: str
)
Parametry:
-
fully_qualified_name(str): W pełni kwalifikowana nazwa grafu, do którego odwołuje się odwołanie -
version(str): Wersja grafu, do którego odwołuje się odwołanie
Podnosi:
-
ValueError: Jeśli fully_qualified_name lub wersja jest pusta
Metody
to_dict
def to_dict() -> Dict[str, Any]
Serializuj do słownika.
Zwraca:
-
Dict[str, Any]: Dokumentacja serializowana
Właściwość
Definicja właściwości z interfejsem bezpiecznym dla typu.
Konstruktor
Property(
name: str,
property_type: PropertyType,
is_non_null: bool = False,
description: str = "",
is_key: bool = False,
is_display_value: bool = False,
is_internal: bool = False
)
Parametry:
-
name(str): Nazwa właściwości -
property_type(PropertyType): Typ danych właściwości -
is_non_null(bool, default=False): czy właściwość jest wymagana -
description(str, default=""):Opis właściwości -
is_key(bool, default=False): czy właściwość jest kluczem -
is_display_value(bool, default=False): czy właściwość jest wartością wyświetlaną -
is_internal(bool, default=False): czy właściwość jest wewnętrzna
Podnosi:
-
ValueError: Jeśli nazwa jest pusta lub weryfikacja kończy się niepowodzeniem
Metody klasy
key
@classmethod
Property.key(
name: str,
property_type: PropertyType,
description: str = "",
is_non_null: bool = False
) -> Property
Utwórz właściwość klucza z typowymi ustawieniami (is_key=True, is_display_value=True).
display
@classmethod
Property.display(
name: str,
property_type: PropertyType,
description: str = "",
is_non_null: bool = False
) -> Property
Utwórz właściwość wartości wyświetlanej (is_display_value=True).
Metody
describe
def describe(text: str) -> Property
Płynnie dodaj opis.
Parametry:
-
text(str): Tekst opisu
Zwraca:
-
Property: Samodzielne tworzenie łańcuchów metod
to_dict
def to_dict() -> Dict[str, Any]
Serializuj właściwość do słownika przy użyciu kluczy adnotacji z prefiksem @.
Zwraca:
-
Dict[str, Any]: Właściwość serializowana
to_gql
def to_gql() -> str
Wygeneruj definicję właściwości GQL.
Zwraca:
-
str: reprezentacja ciągu GQL
Węzeł edgenode
Odwołanie do węzła używane w definicjach krawędzi.
Konstruktor
EdgeNode(
alias: Optional[str] = None,
labels: List[str] = []
)
Parametry:
-
alias(str, opcjonalnie): alias węzła (automatycznie ustawiony na pierwszą etykietę, jeśli brak lub pusty) -
labels(List[str]): Etykiety węzłów (co najmniej jedna wymagana)
Podnosi:
-
ValueError: Jeśli lista etykiet jest pusta -
TypeError: Jeśli etykiety nie są ciągami
Auto-mutacja:
- Jeśli alias ma wartość Brak lub jest pusty, jest ustawiony na pierwszą etykietę
Metody
to_dict
def to_dict() -> Dict[str, Any]
Serializuj do słownika.
Zwraca:
-
Dict[str, Any]: Dokumentacja zserializowanego węzła krawędzi
Node
Definicja węzła z interfejsem bezpiecznym dla typu.
Konstruktor
Node(
alias: str = "",
labels: List[str] = [],
implies_labels: List[str] = [],
properties: List[Property] = [],
description: str = "",
entity_group: str = "",
dynamic_labels: bool = False,
abstract_edge_aliases: bool = False
)
Parametry:
-
alias(str, default=""): alias węzła (automatycznie ustawiany na pierwszą etykietę, jeśli jest pusta) -
labels(List[str]): Etykiety węzłów (co najmniej jedna wymagana) -
implies_labels(List[str], default=[]): Etykiety dorozumiane -
properties(List[Property], default=[]): Właściwości węzła -
description(str, default=""): opis węzła -
entity_group(str, default=""): nazwa grupy jednostek -
dynamic_labels(bool, default=False): czy węzeł ma etykiety dynamiczne -
abstract_edge_aliases(bool, default=False): czy węzeł używa abstrakcyjnych aliasów krawędzi
Podnosi:
-
ValueError: Jeśli weryfikacja zakończy się niepowodzeniem (brak etykiet, bez właściwości klucza, bez właściwości wyświetlania itp.)
Auto-mutacja:
- Jeśli alias jest pusty, jest ustawiony na pierwszą etykietę
- Jeśli entity_group jest pusta, jest ustawiona na etykietę podstawową
Metody
get_primary_label
def get_primary_label() -> Optional[str]
Pobierz etykietę podstawową (pierwszą).
Zwraca:
-
strlubNone: Etykieta podstawowa lub Brak, jeśli nie ma etykiet
get_entity_group_name
def get_entity_group_name() -> str
Pobierz nazwę grupy jednostek lub powrót do etykiety podstawowej.
Zwraca:
-
str: Nazwa grupy jednostek
get_primary_key_property_name
def get_primary_key_property_name() -> Optional[str]
Pobierz nazwę właściwości klucza podstawowego.
Zwraca:
-
strlubNone: Nazwa właściwości klucza podstawowego
get_properties
def get_properties() -> Dict[str, Property]
Uzyskiwanie właściwości jako słownika w celu ułatwienia dostępu.
Zwraca:
-
Dict[str, Property]: Właściwości z kluczem według nazwy
get_property
def get_property(name: str) -> Optional[Property]
Pobierz określoną właściwość według nazwy.
Parametry:
-
name(str): Nazwa właściwości
Zwraca:
-
PropertylubNone: Właściwość, jeśli znaleziono
add_property
def add_property(prop: Property) -> None
Dodaj właściwość do tego węzła.
Parametry:
-
prop(Właściwość): właściwość do dodania
Podnosi:
-
ValueError: Jeśli nazwa właściwości jest zduplikowana
is_dynamically_labeled
def is_dynamically_labeled() -> bool
Sprawdź, czy węzeł ma etykiety dynamiczne.
Zwraca:
-
bool: Prawda, jeśli włączono etykiety dynamiczne
is_abstract_edge_node_aliases
def is_abstract_edge_node_aliases() -> bool
Sprawdź, czy węzeł używa abstrakcyjnych aliasów węzłów krawędzi.
Zwraca:
-
bool: Prawda, jeśli włączono abstrakcyjne aliasy krawędzi
describe
def describe(text: str) -> Node
Płynnie dodaj opis.
Parametry:
-
text(str): Tekst opisu
Zwraca:
-
Node: Samodzielne tworzenie łańcuchów metod
to_dict
def to_dict() -> Dict[str, Any]
Serializowanie węzła do słownika.
Zwraca:
-
Dict[str, Any]: Węzeł serializowany
to_gql
def to_gql() -> str
Generowanie definicji węzła GQL.
Zwraca:
-
str: reprezentacja ciągu GQL
Podnosi:
-
ValueError: Jeśli w węźle nie ma wymaganych pól dla protokołu GQL
Metody klasy
create
@classmethod
Node.create(
alias: str,
labels: List[str],
properties: List[Property],
description: str = "",
entity_group: str = "",
**kwargs
) -> Node
Utwórz węzeł ze wszystkimi wymaganymi polami.
Parametry:
-
alias(str): Alias węzła -
labels(List[str]): Etykiety węzłów -
properties(List[Property]): Właściwości węzła -
description(str, default=""): opis węzła -
entity_group(str, default=""): nazwa grupy jednostek
Zwraca:
-
Node: Nowe wystąpienie węzła
Edge
Definicja krawędzi z interfejsem bezpiecznym dla typów.
Konstruktor
Edge(
relationship_type: str,
source_node_label: str,
target_node_label: str,
direction: EdgeDirection = EdgeDirection.DIRECTED_RIGHT,
properties: List[Property] = [],
description: str = "",
entity_group: str = "",
dynamic_type: bool = False
)
Parametry:
-
relationship_type(str): Typ relacji krawędzi (na przykład "FOLLOWS", "OWNS") -
source_node_label(str): Etykieta węzła źródłowego -
target_node_label(str): Etykieta węzła docelowego -
direction(EdgeDirection, default=DIRECTED_RIGHT): Kierunek krawędzi -
properties(List[Property], default=[]): Właściwości krawędzi -
description(str, default=""): opis krawędzi -
entity_group(str, default=""): nazwa grupy jednostek -
dynamic_type(bool, default=False): czy krawędź ma typ dynamiczny
Podnosi:
-
ValueError: Jeśli weryfikacja nie powiedzie się
Auto-mutacja:
-
labelslista jest wypełniana automatycznie za pomocą polecenia[relationship_type] - Jeśli entity_group jest pusta, jest ustawiona na relationship_type
Właściwości
edge_type
def edge_type() -> str
Alias zgodności z poprzednimi wersjami dla relationship_type.
Zwraca:
-
str: Typ relacji
Metody
get_entity_group_name
def get_entity_group_name() -> str
Pobierz nazwę grupy jednostek lub powrót do typu relacji.
Zwraca:
-
str: Nazwa grupy jednostek
is_dynamic_type
def is_dynamic_type() -> bool
Sprawdź, czy krawędź ma typ dynamiczny.
Zwraca:
-
bool: Prawda, jeśli typ dynamiczny
add_property
def add_property(edge_property: Property) -> None
Dodaj właściwość do tej krawędzi.
Parametry:
-
edge_property(Właściwość): właściwość do dodania
describe
def describe(text: str) -> Edge
Płynnie dodaj opis.
Parametry:
-
text(str): Tekst opisu
Zwraca:
-
Edge: Samodzielne tworzenie łańcuchów metod
to_dict
def to_dict() -> Dict[str, Any]
Serializowanie krawędzi do słownika.
Zwraca:
-
Dict[str, Any]: Serializowana krawędź
to_gql
def to_gql() -> str
Generowanie definicji krawędzi GQL.
Zwraca:
-
str: reprezentacja ciągu GQL
Metody klasy
create
Edge.create(
relationship_type: str,
source_node_label: str,
target_node_label: str,
properties: List[Property] = None,
description: str = "",
entity_group: str = "",
**kwargs
) -> Edge
Utwórz krawędź ze wszystkimi wymaganymi polami.
Parametry:
-
relationship_type(str): Typ relacji krawędzi -
source_node_label(str): Etykieta węzła źródłowego -
target_node_label(str): Etykieta węzła docelowego -
properties(List[Property], opcjonalnie): właściwości krawędzi -
description(str, default=""): opis krawędzi -
entity_group(str, default=""): nazwa grupy jednostek
Zwraca:
-
Edge: Nowe wystąpienie krawędzi
GraphSchema
Definicja schematu grafu z interfejsem bezpiecznym dla typu.
Konstruktor
GraphSchema(
name: str,
nodes: List[Node] = [],
edges: List[Edge] = [],
base_graphs: List[GraphSchema] = [],
description: str = "",
version: str = "1.0",
fully_qualified_name: str = "",
namespace: str = ""
)
Parametry:
-
name(str): nazwa schematu grafu -
nodes(List[Node], default=[]): Definicje węzłów -
edges(List[Edge], default=[]): Definicje krawędzi -
base_graphs(List[GraphSchema], default=[]): Schematy wykresów bazowych -
description(str, default=""): Opis schematu -
version(str, default="1.0"): wersja schematu -
fully_qualified_name(str, default=""): W pełni kwalifikowana nazwa -
namespace(str, default=""): Przestrzeń nazw
Podnosi:
-
ValueError: Jeśli weryfikacja zakończy się niepowodzeniem (zduplikowane aliasy, krawędzie odwołują się do nieistniejących węzłów itp.)
Metody
get_fully_qualified_name
def get_fully_qualified_name() -> str
Pobierz w pełni kwalifikowaną nazwę.
Zwraca:
-
str: W pełni kwalifikowana nazwa
get_namespace
def get_namespace() -> str
Pobierz przestrzeń nazw z w pełni kwalifikowanej nazwy lub zwróć wartość domyślną.
Zwraca:
-
str:Obszaru nazw
get_version
def get_version() -> str
Pobierz wersję.
Zwraca:
-
str: Ciąg wersji
get_node
def get_node(label_or_alias: str) -> Optional[Node]
Pobierz węzeł według etykiety lub aliasu.
Parametry:
-
label_or_alias(str): Etykieta węzła lub alias
Zwraca:
-
NodelubNone: Węzeł w przypadku znalezienia
get_edge
def get_edge(name: str) -> Optional[Edge]
Uzyskiwanie krawędzi według nazwy/typu.
Parametry:
-
name(str): Typ relacji krawędzi
Zwraca:
-
EdgelubNone: Przeglądarka Edge, jeśli została znaleziona
add_node
def add_node(node: Node) -> None
Dodaj węzeł do tego wykresu.
Parametry:
-
node(Węzeł): węzeł do dodania
Podnosi:
-
ValueError: Jeśli alias węzła jest zduplikowany
add_edge
def add_edge(edge: Edge) -> None
Dodaj krawędź do tego wykresu.
Parametry:
-
edge(Przeglądarka Brzegowa): przeglądarka Edge do dodania
Podnosi:
-
ValueError: Jeśli typ krawędzi jest zduplikowany
include_graph
def include_graph(fully_qualified_name: str, version: str) -> GraphSchema
Dodaj graf include (płynny interfejs API).
Parametry:
-
fully_qualified_name(str): W pełni kwalifikowana nazwa grafu do uwzględnienia -
version(str): Wersja grafu do uwzględnienia
Zwraca:
-
GraphSchema: Samodzielne tworzenie łańcuchów metod
get_included_graph_references
def get_included_graph_references() -> List[GraphDefinitionReference]
Pobierz listę dołączonych odwołań do grafów.
Zwraca:
-
List[GraphDefinitionReference]: Lista odwołań do definicji grafu
describe
def describe(text: str) -> GraphSchema
Płynnie dodaj opis.
Parametry:
-
text(str): Tekst opisu
Zwraca:
-
GraphSchema: Samodzielne tworzenie łańcuchów metod
to_dict
def to_dict() -> Dict[str, Any]
Serializowanie schematu do słownika.
Zwraca:
-
Dict[str, Any]: Schemat serializowany
to_json
def to_json(indent: int = 2) -> str
Generowanie reprezentacji JSON.
Parametry:
-
indent(int, default=2): poziom wcięcia JSON
Zwraca:
-
str: ciąg JSON
to_gql
def to_gql() -> str
Generowanie definicji schematu GQL.
Zwraca:
-
str: reprezentacja ciągu GQL
Metody klasy
create
@classmethod
GraphSchema.create(
name: str,
nodes: List[Node] = None,
edges: List[Edge] = None,
description: str = "",
version: str = "1.0",
**kwargs
) -> GraphSchema
Utwórz schemat grafu ze wszystkimi wymaganymi polami.
Parametry:
-
name(str): nazwa schematu grafu -
nodes(List[Node], opcjonalnie): Definicje węzłów -
edges(List[Edge], opcjonalnie): Definicje krawędzi -
description(str, default=""): Opis schematu -
version(str, default="1.0"): wersja schematu
Zwraca:
-
GraphSchema: Nowe wystąpienie schematu grafu
Klasy wejściowe zapytań
Klasy danych reprezentujące parametry wejściowe dla wstępnie zdefiniowanych zapytań grafów.
Uwaga
Przekazywanie QueryInput obiektów bezpośrednio do Graph metod zapytań jest przestarzałe i zostanie usunięte w przyszłych wersjach.
Zamiast tego użyj argumentów słów kluczowych. Metody Graph (reachability, , k_hopblast_radius, centrality, ) rankedakceptują wszystkie parametry jako argumenty słów kluczowych i konstruują obiekty wejściowe wewnętrznie. Te klasy pozostają na razie w bazie kodu, ale nie powinny być używane w nowym kodzie.
QueryInputBase
Klasa podstawowa dla wszystkich parametrów wejściowych zapytania.
Metody
to_json_payload
def to_json_payload() -> Dict[str, Any]
Konwertuj parametry wejściowe na słownik na potrzeby przesyłania interfejsu API.
Zwraca:
-
Dict[str, Any]: Słownikowe reprezentacje parametrów wejściowych
validate
def validate() -> None
Zweryfikuj parametry wejściowe.
Podnosi:
-
ValueError: Jeśli parametry wejściowe są nieprawidłowe
ReachabilityQueryInput
Parametry wejściowe zapytania o osiągalność między węzłami źródłowymi i docelowymi.
Dziedziczy element, z ReachabilityQueryInputBase którego dziedziczy element .QueryInputBase
Pola
| Pole | Typ | Domyślne | Opis |
|---|---|---|---|
source_property_value |
str |
(wymagane) | Wartość zgodna z właściwością źródłową |
target_property_value |
str |
(wymagane) | Wartość zgodna z właściwością docelową |
source_property |
Optional[str] |
None |
Nazwa właściwości do filtrowania węzłów źródłowych |
participating_source_node_labels |
Optional[List[str]] |
None |
Etykiety węzłów do rozważenia jako węzły źródłowe |
target_property |
Optional[str] |
None |
Nazwa właściwości do filtrowania węzłów docelowych |
participating_target_node_labels |
Optional[List[str]] |
None |
Etykiety węzłów do uwzględnienia jako węzły docelowe |
participating_edge_labels |
Optional[List[str]] |
None |
Etykiety krawędzi do przejścia w ścieżce |
is_directional |
Optional[bool] |
True |
Czy krawędzie są kierunkowe |
min_hop_count |
Optional[int] |
1 |
Minimalna liczba przeskoków w ścieżce |
max_hop_count |
Optional[int] |
4 |
Maksymalna liczba przeskoków w ścieżce |
shortest_path |
Optional[bool] |
False |
Czy znaleźć tylko najkrótszą ścieżkę |
max_results |
Optional[int] |
500 |
Maksymalna liczba wyników do zwrócenia |
Sprawdzania poprawności:
-
source_property_valuejest wymagane -
target_property_valuejest wymagane
Przykład:
# Preferred: keyword arguments (no import needed)
result = graph.reachability(
source_property="UserId",
source_property_value="user123",
target_property="DeviceId",
target_property_value="device456",
participating_edge_labels=["accessed", "connected_to"],
shortest_path=True
)
# DEPRECATED — will be removed in a future version. Use keyword arguments above.
from sentinel_graph.builders.query_input import ReachabilityQueryInput
result = graph.reachability(query_input=ReachabilityQueryInput(
source_property_value="user123",
target_property_value="device456"
))
K_HopQueryInput
Parametry wejściowe zapytania k-hop z danego węzła źródłowego.
Dziedziczy po elem ReachabilityQueryInputBase.
Dziedziczy wszystkie pola z ReachabilityQueryInputprogramu .
Sprawdzania poprawności:
- Co najmniej jeden z
source_property_valuelubtarget_property_valuemusi zostać dostarczony
Przykład:
# Preferred: keyword arguments
result = graph.k_hop(
source_property_value="user123",
max_hop_count=3,
participating_edge_labels=["accessed"]
)
# DEPRECATED — will be removed in a future version. Use keyword arguments above.
from sentinel_graph.builders.query_input import K_HopQueryInput
result = graph.k_hop(query_input=K_HopQueryInput(source_property_value="user123"))
BlastRadiusQueryInput
Parametry wejściowe zapytania promienia wybuchu od węzła źródłowego do docelowego.
Dziedziczy po elem ReachabilityQueryInputBase.
Dziedziczy wszystkie pola z ReachabilityQueryInputprogramu z następującymi wymaganymi polami:
| Pole | Typ | Wymagany | Opis |
|---|---|---|---|
source_property_value |
str |
Tak | Wartość identyfikująca węzeł źródłowy |
target_property_value |
str |
Tak | Wartość identyfikująca węzeł docelowy |
Sprawdzania poprawności:
-
source_property_valuejest wymagane -
target_property_valuejest wymagane
Przykład:
# Preferred: keyword arguments
result = graph.blast_radius(
source_property_value="user123",
target_property_value="device456",
participating_edge_labels=["accessed", "connected_to"]
)
# DEPRECATED — will be removed in a future version. Use keyword arguments above.
from sentinel_graph.builders.query_input import BlastRadiusQueryInput
result = graph.blast_radius(query_input=BlastRadiusQueryInput(
source_property_value="user123",
target_property_value="device456"
))
CentralityQueryInput
Parametry wejściowe zapytania analizy centralności.
Dziedziczy po elem QueryInputBase.
CentralityType, wyliczenie
| Value | Opis |
|---|---|
CentralityType.Node |
Centralność węzła obliczeniowego |
CentralityType.Edge |
Centralność krawędzi obliczeniowej |
Pola
| Pole | Typ | Domyślne | Opis |
|---|---|---|---|
threshold |
Optional[int] |
3 |
Minimalny wynik centralności do rozważenia |
centrality_type |
CentralityType |
CentralityType.Node |
Typ centralności do obliczenia |
max_paths |
Optional[int] |
1000000 |
Maksymalna liczba ścieżek do rozważenia (0 = wszystkie) |
participating_source_node_labels |
Optional[List[str]] |
None |
Etykiety węzłów źródłowych |
participating_target_node_labels |
Optional[List[str]] |
None |
Etykiety węzłów docelowych |
participating_edge_labels |
Optional[List[str]] |
None |
Etykiety krawędzi do przejścia |
is_directional |
Optional[bool] |
True |
Czy krawędzie są kierunkowe |
min_hop_count |
Optional[int] |
1 |
Minimalna liczba przeskoków |
max_hop_count |
Optional[int] |
4 |
Maksymalna liczba przeskoków |
shortest_path |
Optional[bool] |
False |
Tylko najkrótsze ścieżki |
max_results |
Optional[int] |
500 |
Maksymalna liczba wyników |
Przykład:
# Preferred: keyword arguments (works for all centrality types)
result = graph.centrality(
centrality_type=CentralityType.Edge, # or CentralityType.Node (default)
participating_edge_labels=["accessed", "connected_to"],
threshold=5,
max_results=100
)
# DEPRECATED — will be removed in a future version. Use keyword arguments above.
from sentinel_graph.builders.query_input import CentralityQueryInput, CentralityType
result = graph.centrality(query_input=CentralityQueryInput(
centrality_type=CentralityType.Edge,
participating_edge_labels=["accessed"]
))
RankingQueryInput
Parametry wejściowe zapytania analizy rankingowej.
Dziedziczy po elem QueryInputBase.
Pola
| Pole | Typ | Domyślne | Opis |
|---|---|---|---|
rank_property_name |
str |
(wymagane) | Nazwa właściwości do użycia na potrzeby ścieżek klasyfikacji |
threshold |
Optional[int] |
0 |
Zwracane są tylko ścieżki z wagami powyżej tej wartości |
max_paths |
Optional[int] |
1000000 |
Maksymalna liczba ścieżek do rozważenia (0 = wszystkie) |
decay_factor |
Optional[float] |
1 |
Jak bardzo każdy krok wykresu zmniejsza rangę (2 = połówki w każdym kroku) |
is_directional |
Optional[bool] |
True |
Czy krawędzie są kierunkowe |
min_hop_count |
Optional[int] |
1 |
Minimalna liczba przeskoków |
max_hop_count |
Optional[int] |
4 |
Maksymalna liczba przeskoków |
shortest_path |
Optional[bool] |
False |
Tylko najkrótsze ścieżki |
max_results |
Optional[int] |
500 |
Maksymalna liczba wyników |
Przykład:
# Preferred: keyword arguments
result = graph.ranked(
rank_property_name="risk_score",
threshold=5,
decay_factor=2,
max_results=50
)
# DEPRECATED — will be removed in a future version. Use keyword arguments above.
from sentinel_graph.builders.query_input import RankedQueryInput
result = graph.ranked(query_input=RankedQueryInput(
rank_property_name="risk_score",
threshold=5
))
Wyniki zapytania
QueryResult
Wynik zapytania grafowego z dostępem do leniwej ramki danych.
Konstruktor
QueryResult(raw_response: Dict[str, Any], graph: Graph)
Parametry:
-
raw_response(Dict[str, Any]): Słownik odpowiedzi nieprzetworzonego interfejsu API -
graph(Graf): odwołanie do nadrzędnego grafu
Uwaga: Zazwyczaj tworzone przez Graph.query()program nie są tworzone bezpośrednio.
Metody
to_dataframe
def to_dataframe() -> DataFrame
Konwertuje wynik zapytania na ramkę danych platformy Spark.
Zwraca:
-
DataFrame: Wynik zapytania jako ramka danych platformy Spark
Podnosi:
-
ValueError: Jeśli konwersja zakończy się niepowodzeniem
Przykład:
result = graph.query("MATCH (u:user) RETURN u")
df = result.to_dataframe()
df.show()
get_raw_data
def get_raw_data() -> Dict[str, Any]
Pobierz sekcję RawData z odpowiedzi.
Zwraca:
-
Dict[str, Any]: Słownik z nieprzetworzonymi metadanymi lub pustym dictem, jeśli nie istnieje
Przykład:
result = graph.query("MATCH (u:user) RETURN u")
metadata = result.get_raw_data()
show
def show(format: str = "visual") -> None
Wyświetl wynik zapytania w różnych formatach.
Parametry:
-
format(str, default="visual"): format danych wyjściowych-
"table": Pełne tabele ramek danych (wszystkie kolumny) -
"visual": Interaktywna wizualizacja grafu z wtyczką VSC -
"all": Pokaż wszystkie formaty
-
Podnosi:
-
ValueError: Jeśli format nie jest jedną z obsługiwanych wartości
Przykład:
result = graph.query("MATCH (u:user)-[r:accessed]->(d:device) RETURN u, r, d")
result.show() # Visual by default
result.show(format="table") # Table format
Kompletny przykład (zalecane — wersja 0.3 lub nowsza)
# 0. Imports
from sentinel_graph import GraphSpecBuilder, Graph
# 1. Define graph specification
spec = (
GraphSpecBuilder.start()
.add_node("User")
.from_dataframe(user_nodes) # native Spark DF from groupBy → no .df
.with_columns(
"UserId", "UserDisplayName", "UserPrincipalName",
"DistinctLocationCount", "DistinctIPCount", "DistinctAppCount",
"TotalSignIns", "RiskySignInCount", "ImpossibleTravelFlag",
key="UserId", display="UserDisplayName"
)
.add_node("IPAddress")
.from_dataframe(ip_nodes) # native Spark DF from groupBy → no .df
.with_columns(
"IPAddress", "UniqueUsers", "UniqueLocations",
"SignInCount", "RiskySignInCount", "SharedIPFlag",
key="IPAddress", display="IPAddress"
)
.add_edge("UsedIP")
.from_dataframe(edge_used_ip) # native Spark DF → no .df
.source(id_column="UserId", node_type="User")
.target(id_column="IPAddress", node_type="IPAddress")
.with_columns(
"SignInCount", "FirstSeen", "LastSeen", "EdgeKey",
key="EdgeKey", display="EdgeKey"
)
.done()
)
# 2. Inspect schema before building (GraphSpec owns this)
spec.show_schema()
# 3. Build: prepares data + publishes graph → returns Graph
graph = Graph.build(spec)
print(f"Build status: {graph.build_status.status}")
# 4. Query the graph (query lives on Graph)
result = graph.query("MATCH (u:user)-[used:UsedIP]->(ip:IPAddress) RETURN * LIMIT 100")
result.show()
# 5. Access data via delegation
df = result.to_dataframe()
df.printSchema()
# 6. Graph algorithms
gf = graph.to_graphframe()
pagerank_result = gf.pageRank(resetProbability=0.15, maxIter=10)
pagerank_result.vertices.select("id", "pagerank").show()
# 7. Fetch an existing graph (no spec needed)
graph = Graph.get("my_existing_graph", context=context)
graph.query("MATCH (n) RETURN n LIMIT 10").show()
Uwagi dotyczące wzorców projektowych
Płynny interfejs API
Wszyscy konstruktorzy obsługują tworzenie łańcuchów metod dla czytelnych, deklaratywnych definicji grafu:
builder.add_node("user") \
.from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.add_edge("follows")
Schematy unii
Wiele krawędzi o tym samym aliasie jest automatycznie połączonych ze scalonymi właściwościami:
# Both edges use alias "sign_in" - they will be merged into one schema edge
builder.add_edge("sign_in") \
.from_table("AzureSignins") \
.source(id_column="UserId", node_type="AZuser") \
.target(id_column="DeviceId", node_type="device")
builder.add_edge("sign_in") \
.from_table("EntraSignins") \
.source(id_column="UserId", node_type="EntraUser") \
.target(id_column="DeviceId", node_type="device")
Autokonfiguracji
Wiele pól ma rozsądne wartości domyślne:
- Etykiety węzłów/krawędzi są domyślne dla ich aliasów
- Właściwości są automatycznie wnioskowane ze schematów źródłowych
- Domyślne grupy jednostek to etykiety główne/typy relacji
Ocena z opóźnieniem
Ramki danych i zasoby są ładowane w sposób leniwy i buforowane:
-
graph_spec.nodesigraph_spec.edgessą ładowane przy pierwszym dostępie - Wyniki zapytania tworzą ramki danych tylko w przypadku żądania