Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Den sentinel_graph klasse gør det muligt at interagere med grafen Microsoft Sentinel, så du kan definere dit grafskema, transformere data fra den Microsoft Sentinel datasø til noder og kanter, publicere en graf, en forespørgselsgraf og køre avancerede grafalgoritmer. Denne klasse er udviklet til at fungere sammen med Spark-sessioner i Jupyter-notesbøger, der kører på Microsoft Sentinel spark-beregning.
GraphSpecBuilder
Klassen GraphSpecBuilder giver en flydende generator til oprettelse af grafspecifikationer med datapipelines og skemaintegration.
Vigtigt!
Aliasset GraphBuilder for denne klasse frarådes og fjernes i en fremtidig version. Bruges GraphSpecBuilder i al ny kode.
# Deprecated — emits DeprecationWarning
from sentinel_graph.builders.graph_builder import GraphBuilder
# Recommended
from sentinel_graph import GraphSpecBuilder
Konstruktør
GraphSpecBuilder(context: ExecutionContext)
Parametre:
-
context(ExecutionContext): Udførelseskontekst, der indeholder Spark-session og -konfiguration
Rejser:
-
ValueError: Hvis konteksten er None eller graph name kan ikke bestemmes
Statiske metoder
start
GraphSpecBuilder.start(context: Optional[ExecutionContext] = None) -> GraphSpecBuilder
Definer en ny flydende grafgenerator.
Parametre:
-
context(ExecutionContext, valgfrit): ExecutionContext-forekomst. Hvis Ingen, bruges standardkontekst.
Returnerer:
-
GraphSpecBuilder, ny forekomst af generator
Eksempel:
builder = GraphSpecBuilder.start(context=context)
Metoder til forekomst
add_node
def add_node(alias: str) -> NodeBuilderInitial
Begynd at oprette en nodedefinition.
Parametre:
-
alias(str): Entydigt id for denne node i grafen
Returnerer:
-
NodeBuilderInitial: Nodegenerator i starttilstand
Eksempel:
builder.add_node("user")
add_edge
def add_edge(alias: str) -> EdgeBuilderInitial
Begynd at oprette en edge-definition.
Parametre:
-
alias(str): Identifikator for denne kant i grafen (kan deles på tværs af flere kanter)
Returnerer:
-
EdgeBuilderInitial: Edge Builder i starttilstand
Eksempel:
builder.add_edge("accessed")
done
def done() -> GraphSpec
Afslut grafspecifikationen, og returner forekomsten GraphSpec.
Returnerer:
-
GraphSpec: Komplet grafspecifikation med datapipeline og skema
Rejser:
-
ValueError: Hvis grafen ikke har noder eller kanter, eller hvis valideringen mislykkes
Eksempel:
graph_spec = builder.done()
GraphSpec
Grafspecifikation med datapipeline, skema og visningsfunktioner.
Konstruktør
GraphSpec(
name: str,
context: ExecutionContext,
graph_schema: GraphSchema,
etl_pipeline: Optional[ETLPipeline] = None
)
Parametre:
-
name(str): Grafnavn -
context(ExecutionContext): Udførelseskontekst -
graph_schema(GraphSchema): Grafskemadefinition -
etl_pipeline(ETLPipeline, valgfrit): Datapipeline til grafforberedelse
Egenskaber
nodes
def nodes() -> DataFrame
Hent noderne DataFrame (doven, cachelagret). Bestemmer automatisk kilde fra datapipeline eller søtabel.
Returnerer:
-
DataFrame: Spark DataFrame, der indeholder alle noder
Rejser:
-
ValueError: Hvis konteksten mangler, eller DataFrames ikke kan indlæses
edges
def edges() -> DataFrame
Hent kanter DataFrame (doven, cachelagret). Bestemmer automatisk kilde fra datapipeline eller søtabel.
Returnerer:
-
DataFrame, Spark DataFrame, der indeholder alle kanter
Rejser:
-
ValueError: Hvis konteksten mangler, eller DataFrames ikke kan indlæses
Metoder
build_graph_with_data
Bemærk!
build_graph_with_data frarådes og fjernes i en fremtidig version.
Brug Graph.build(spec) i stedet.
def build_graph_with_data() -> Dict[str, Any]
Udfør datapipelinen, og publicer grafen.
Internt kalder Graph.build(self), gemmer den returnerede Graphog returnerer en bagudkompatibel ordbog.
Returnerer:
-
Dict[str, Any]: Ordbog, der indeholder:-
etl_result: Resultater af dataforberedelse -
api_result, publicere resultater (hvis det lykkes) -
api_error: Fejlstreng (hvis publicering mislykkedes) -
instance_name: Navn på diagramforekomst -
status:"published"eller"prepared"
-
Eksempel:
graph = Graph.build(spec)
print(f"Status: {graph.build_status.status}")
get_schema
def get_schema() -> GraphSchema
Hent grafskemaet.
Returnerer:
-
GraphSchema: Grafskemadefinition
get_pipeline
Bemærk!
Denne metode frarådes og fjernes i en fremtidig version. Datapipelinen er en intern implementeringsdetalje og bør ikke tilgås direkte.
def get_pipeline() -> Optional[ETLPipeline]
Hent datapipelinen (ingen for eksisterende grafer).
Returnerer:
-
ETLPipelineellerNone: Datapipeline, hvis den er tilgængelig
to_graphframe
def to_graphframe(column_mapping: Optional[Dict[str, str]] = None) -> GraphFrame
Konvertér hele grafen til GraphFrame for at køre grafalgoritmer. Fungerer kun på lokale data (fra datapipeline eller søtabel).
Parametre:
-
column_mapping(Dict[str, str], valgfrit): Brugerdefineret kolonnetilknytning med nøgler:-
"id", kolonnenavn for knude-id -
"source_id": Kolonnenavn for Edge-kilde-id -
"target_id": Kolonnenavn for Edge-destinations-id
-
Returnerer:
-
GraphFrame: GraphFrame-objekt med alle knudepunkter og kanter
Rejser:
-
ValueError: Hvis ExecutionContext ikke er tilgængelig
Eksempel:
gf = graph_spec.to_graphframe()
pagerank = gf.pageRank(resetProbability=0.15, maxIter=10)
show
def show(limit: int = 100, viz_format: str = "visual") -> None
Vis grafdata i forskellige formater.
Parametre:
-
limit(int, default=100): Maksimalt antal noder/kanter, der skal vises -
viz_format(str, default="visual"): Outputformat-
"table", komplette DataFrame-tabeller (alle kolonner) -
"visual", interaktiv grafvisualisering -
"all": Vis alle formater
-
Rejser:
-
ValueError: Hvis format ikke er en af de understøttede værdier
Eksempel:
graph_spec.show(limit=50, viz_format="table")
show_schema
def show_schema() -> None
Vis grafskemaet som en interaktiv grafvisualisering.
Eksempel:
spec.show_schema()
Graf
Grafforekomst, der kan forespørges på. Oprettet via Graph.get() (eksisterende graf) eller Graph.build() (fra en GraphSpec).
Konstruktør
Graph(
name: str,
context: ExecutionContext,
spec: Optional[GraphSpec] = None,
build_status: Optional[BuildStatus] = None,
)
Parametre:
-
name(str): Grafnavn -
context(ExecutionContext): Udførelseskontekst -
spec(GraphSpec, valgfrit): Vedhæftet grafspecifikation (angivet afGraph.build()) -
build_status(BuildStatus, valgfrit): Byg resultatmetadata (angivet afGraph.build())
Rejser:
-
ValueError: Hvis ExecutionContext ikke er nogen
Statiske metoder
get
Graph.get(name: str, context: Optional[ExecutionContext] = None) -> Graph
Hent en grafforekomst fra en eksisterende graf.
Den returnerede Graph har spec=None og build_status=None.
Parametre:
-
name(str): Navn på grafforekomst -
context(ExecutionContext, valgfrit): Udførelseskontekst (standard til ExecutionContext.default())
Returnerer:
-
Graph: Grafforekomst
Rejser:
-
ValueError: Hvis grafnavnet er tomt, eller grafforekomsten ikke findes
Eksempel:
graph = Graph.get("my_graph", context=context)
graph.query("MATCH (n) RETURN n")
prepare
Graph.prepare(spec: GraphSpec) -> Graph
Kør fasen til dataforberedelse for en GraphSpecuden at publicere. Brug publish() derefter til at registrere grafen og gøre det muligt at forespørge på den.
Parametre:
-
spec(GraphSpec): Grafspecifikation, der skal forberedes
Returnerer:
-
Graph: Grafforekomst medspecvedhæftet ogbuild_status.status == "prepared"
Rejser:
-
ValueError: Hvis specifikationen ikke har nogen datapipeline eller ingen udførelseskontekst -
RuntimeError: Hvis udførelsen af datapipeline mislykkes
Eksempel:
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
Opret en graf ud fra en GraphSpec ved at forberede data og publicere. Internt kald Graph.prepare(spec) og forsøger graph.publish()derefter . I modsætning til at kalde disse to metoder separat, registreres publiceringsfejl – den returnerede graf har build_status.status == "prepared" og build_status.api_error er angivet i stedet for at hæve.
Parametre:
-
spec(GraphSpec): Grafspecifikation, der skal bygges ud fra
Returnerer:
-
Graph: Diagramforekomst medspecvedhæftet ogbuild_statusudfyldt
Rejser:
-
ValueError: Hvis specifikationen ikke har nogen datapipeline eller ingen udførelseskontekst -
RuntimeError: Hvis udførelsen af datapipeline mislykkes
Eksempel:
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")
Egenskaber
nodes
def nodes() -> Optional[DataFrame]
Hent noderne DataFrame. Uddelegerer til self.spec.nodes , når en specifikation er vedhæftet. Returnerer ellers None .
edges
def edges() -> Optional[DataFrame]
Hent kanter DataFrame. Uddelegerer til self.spec.edges , når en specifikation er vedhæftet. Returnerer ellers None .
schema
def schema() -> Optional[GraphSchema]
Hent grafskema. Uddelegerer til self.spec.get_schema() , når en specifikation er vedhæftet. Returnerer ellers None .
Metoder
query
def query(query_string: str, query_language: str = "GQL") -> QueryResult
Udfør en forespørgsel i forhold til grafforekomsten ved hjælp af GQL.
Parametre:
-
query_string(str): Grafforespørgselsstreng (GQL-sprog) -
query_language(str, default="GQL"): Forespørgselssprog
Returnerer:
-
QueryResult: Objekt, der indeholder noder, kanter og metadata
Rejser:
-
ValueError: Hvis ExecutionContext eller Spark-sessionen mangler -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Eksempel:
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
[! BEMÆRK!
reachability(query_input=ReachabilityQueryInput(...))er stadig accepteret, men udsenderDeprecationWarningog fjernes i en fremtidig version.
Udfør analyse af rækkevidden mellem kilde- og destinationsnoder.
Parametre:
-
source_property_value(str): Værdi, der svarer til kildeegenskaben (valideret på kørselstidspunktet. Skal angives, når der ikke brugesquery_input) -
target_property_value(str): Værdi, der svarer til destinationsegenskaben (valideret på kørselstidspunktet. Skal angives, når der ikke brugesquery_input) -
source_property(Valgfrit[str]): Egenskabsnavn til filtrering af kildenoder -
participating_source_node_labels(Valgfri[List[str]]): Nodenavne, der skal overvejes som kilder -
target_property(Valgfrit[str]): Egenskabsnavn til filtrering af destinationsnoder -
participating_target_node_labels(Valgfri[List[str]]): Nodenavne, der skal overvejes som mål -
participating_edge_labels(Valgfri[List[str]]): Edge-mærkater, der skal gennemgås -
is_directional(bool): Om kanterne er retningsbestemt (standard:True) -
min_hop_count(int): Minimumhop (standard:1) -
max_hop_count(int): Maksimalt antal hop (standard:4) -
shortest_path(bool): Returner kun korteste stier (standard:False) -
max_results(int): Maksimalt antal resultater (standard:500)
Rejser:
-
ValueError: Hvissource_property_valueellertarget_property_valuemangler,min_hop_count < 1,max_hop_count < min_hop_countellermax_results < 1 -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Returnerer:
-
QueryResult: Indeholder rækkeviddestierne
Eksempel:
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
Bemærk!
k_hop(query_input=K_HopQueryInput(...)) accepteres stadig, men udsender DeprecationWarning og fjernes i en fremtidig version.
Udfør k-hop-analyse fra en given kildenode.
Parametre:
- Samme som
reachability
Validering:
- Der skal angives mindst én af
source_property_valueellertarget_property_value
Rejser:
-
ValueError: Hvis hverkensource_property_valueer angivet ellertarget_property_valueangivet, eller hvis numeriske begrænsninger krænkes (samme somreachability) -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Returnerer:
-
QueryResult: Indeholder k-hop-resultaterne
Eksempel:
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
Bemærk!
blast_radius(query_input=BlastRadiusQueryInput(...)) accepteres stadig, men udsender DeprecationWarning og fjernes i en fremtidig version.
Udfør analyse af eksplosionsradius fra kildenode til destinationsnode.
Parametre:
-
source_property_value(str): Værdi, der identificerer kildenoden (valideret på kørselstidspunktet. Skal angives, når der ikke brugesquery_input) -
target_property_value(str): Værdi, der identificerer destinationsnoden (valideret på kørselstidspunktet. Skal angives, når der ikke brugesquery_input) - Andre parametre: samme som
reachability
Rejser:
-
ValueError: Hvissource_property_valueellertarget_property_valuemangler, eller hvis numeriske begrænsninger krænkes (samme somreachability) -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Returnerer:
-
QueryResult: Indeholder resultaterne for eksplosionsradius
Eksempel:
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
Bemærk!
centrality(query_input=CentralityQueryInput(...)) accepteres stadig, men udsender DeprecationWarning og fjernes i en fremtidig version.
Udfør centralitetsanalyse på grafen.
Parametre:
-
participating_source_node_labels(Valgfri[List[str]]): Kildenodenavne -
participating_target_node_labels(Valgfri[List[str]]): Destinationsnodenavne -
participating_edge_labels(Valgfri[List[str]]): Edge-mærkater, der skal gennemgås -
threshold(int): Mindste centralitetsscore (standard:3); skal være ikke-negativ -
centrality_type(CentralityType):CentralityType.NodeellerCentralityType.Edge(standard:None, går tilbage tilCentralityType.Node) -
max_paths(int): Det maksimale antal stier, der skal overvejes (standard:1000000;0= alle stier), skal være ikke-negative -
is_directional(bool): Om kanterne er retningsbestemt (standard:True) -
min_hop_count(int): Minimumhop (standard:1); skal være ≥ 1 -
max_hop_count(int): Maksimumhop (standard:4); skal være ≥min_hop_count -
shortest_path(bool): Returner kun korteste stier (standard:False) -
max_results(int): Maksimalt antal resultater (standard:500); skal være ≥ 1
Rejser:
-
ValueError: Hvisthreshold < 0,max_paths < 0,min_hop_count < 1,max_hop_count < min_hop_countellermax_results < 1 -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Returnerer:
-
QueryResult: Indeholder centralitetsmålepunkterne
Eksempel:
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
Bemærk!
ranked(query_input=RankedQueryInput(...)) accepteres stadig, men udsender DeprecationWarning og fjernes i en fremtidig version.
Udfør rangerede analyser på grafen.
Parametre:
-
rank_property_name(str): Egenskabsnavn, der skal bruges til rangering (valideret på kørselstidspunktet. Skal angives, når der ikke brugesquery_input) -
threshold(int): Returner kun stier over denne vægt (standard:0); skal være ikke-negative -
max_paths(int): Det maksimale antal stier, der skal overvejes (standard:1000000;0= alle stier), skal være ikke-negative -
decay_factor(flydende): Rangordnet henfald pr. trin; 2 betyder halvering (standard:1); skal være ikke-negativ -
is_directional(bool): Om kanterne er retningsbestemt (standard:True) -
min_hop_count(int): Minimumhop (standard:1); skal være ≥ 1 -
max_hop_count(int): Maksimumhop (standard:4); skal være ≥min_hop_count -
shortest_path(bool): Returner kun korteste stier (standard:False) -
max_results(int): Maksimalt antal resultater (standard:500); skal være ≥ 1
Rejser:
-
ValueError: Hvisrank_property_namemangler, ,threshold < 0max_paths < 0,decay_factor < 0,min_hop_count < 1,max_hop_count < min_hop_count, ellermax_results < 1 -
RuntimeError: Hvis klientinitialisering eller udførelse af forespørgsler mislykkes
Returnerer:
-
QueryResult: Indeholder de rangerede noder/kanter
Eksempel:
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
Konvertér hele grafen til GraphFrame. Bruger spec-data, når de er tilgængelige. læser fra søtabeller ellers.
Parametre:
-
column_mapping(Dict[str, str], valgfrit): Brugerdefineret kolonnetilknytning
Returnerer:
-
GraphFrame: GraphFrame-objekt med alle knudepunkter og kanter
Eksempel:
gf = graph.to_graphframe()
show
def show() -> None
Vis grafoplysninger. Uddelegerer til spec.show() til avanceret visning, når en specifikation er vedhæftet. Ellers udskrives minimale oplysninger.
show_schema
def show_schema() -> None
Vis grafskema. Delegerer til spec.show_schema() , når en specifikation er vedhæftet. Udskriver en meddelelse, der angiver, at der ellers ikke er noget tilgængeligt skema.
publish
(ny i v0.3.3)
def publish() -> Graph
Registrer grafen med API'en, så den kan forespørges. Kald dette efter Graph.prepare() (eller på en hvilken som helst Graph , der har en specifikation tilknyttet) for at publicere grafforekomsten.
Returnerer:
-
Graph: Selv for metodekæde
Rejser:
-
ValueError: Hvis der ikke er knyttet en specifikation, eller hvis der mangler en kontekst -
RuntimeError: Hvis publiceringen mislykkes
Eksempel:
graph = Graph.prepare(spec)
graph.publish()
# Now the graph is queryable
graph.query("MATCH (n) RETURN n")
BuildStatus
Dataclass, der indeholder metadata fra en Graph.build() handling.
Felter
| Feltet | Type | Beskrivelse |
|---|---|---|
etl_result |
Any |
Resultat fra fasen (udførelse af prepare datapipeline) |
api_result |
Optional[Dict] |
Resultat fra publiceringsfasen (None hvis udgivelsen mislykkedes) |
api_error |
Optional[str] |
Fejlmeddelelse, hvis publiceringen mislykkedes (None hvis udgivelsen lykkedes) |
instance_name |
str |
Navnet på grafforekomsten |
status |
Optional[BuildStatusKind] |
None, "published"eller "prepared" |
Byggestier
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)
Eksempel:
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")
Node Builders
NodeBuilderInitial
Starttilstand for nodegenerator: Kun tilgængelige datakildemetoder.
Konstruktør
NodeBuilderInitial(alias: str, graph_builder: GraphSpecBuilder)
Bemærk: Oprettes typisk via GraphSpecBuilder.add_node(), ikke direkte instantieret.
Metoder
Bemærk!
Brugen af understregningstegn _ ved navngivning af noder, kanter eller egenskaber i et brugerdefineret diagram understøttes ikke. Der returneres en ugyldig anmodningsfejl, når der bruges understregningstegn.
from_table
def from_table(table_name: str, database: Optional[str] = None) -> NodeBuilderSourceSet
Angiv tabel som datakilde med intelligent databaseopløsning.
Parametre:
-
table_name(str): Navnet på tabellen (påkrævet) -
database(str, valgfrit): Eksplicit databasenavn (tilsidesætter standardkonteksten)
Returnerer:
-
NodeBuilderSourceSet: Generator til yderligere konfiguration
Rejser:
-
ValueError: Hvis tabellen ikke blev fundet, eller der blev fundet flere modstridende tabeller
Databaseløsningsrækkefølge:
- Eksplicit
databaseparameter (højeste prioritet) - ExecutionContext.default_database
- Søg i alle databaser (med konfliktregistrering)
Eksempel:
builder.add_node("user").from_table("SigninLogs", database="security_db")
from_dataframe
def from_dataframe(dataframe: DataFrame) -> NodeBuilderSourceSet
Angiv Spark DataFrame som datakilde.
Parametre:
-
dataframe(DataFrame): Spark DataFrame
Returnerer:
-
NodeBuilderSourceSet: Generator til yderligere konfiguration
Eksempel:
df = spark.read.table("users")
builder.add_node("user").from_dataframe(df)
NodeBuilderSourceSet
Node builder, når datakilden er angivet: tilgængelige konfigurationsmetoder.
Konstruktør
NodeBuilderSourceSet(alias: str, graph_builder: GraphSpecBuilder, source_step: DataInputETLStep)
Bemærk: Oprettet internt af NodeBuilderInitial-kildemetoder.
Metoder
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
Anvend filtrering af tidsinterval på nodens datakilde.
Parametre:
-
time_column(str): Kolonnenavn, der indeholder tidsstempeldata (påkrævet) -
start_time(str eller datetime, valgfrit): Startdato ('10/20/25', '2025-10-20' eller datetime-objekt) -
end_time(str eller datetime, valgfrit): Slutdato (samme formater som start_time) -
lookback_hours(flydende, valgfrit): Timer, der skal kigges tilbage fra nu
Returnerer:
-
NodeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis klokkeslætskolonnen ikke blev fundet i kildeskemaet
Tidsintervallogik:
- Hvis start_time og end_time angivet: Brug dem direkte
- Hvis der kun er angivet lookback_hours: end=now, skal du starte=now-lookback_hours
- Hvis der ikke er angivet noget: ingen tidsfiltrering
- Hvis start/slut OG lookback_hours: start/slut har forrang
Eksempel:
# 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
Angiv nodenavn (standard er alias, hvis det ikke kaldes).
Parametre:
-
label(str): Nodenavn
Returnerer:
-
NodeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis navnet allerede er angivet
Eksempel:
builder.add_node("u").from_table("Users").with_label("user")
with_columns
def with_columns(
*columns: str,
key: str,
display: str
) -> NodeBuilderSourceSet
Konfigurer kolonner med den påkrævede nøgle og visningsangivelse.
Parametre:
-
*columns(str): Kolonnenavne, der skal medtages (mindst ét påkrævet) -
key(str): Det kolonnenavn, der skal markeres som nøgle (obligatorisk, skal være i kolonner) -
display(str): Det kolonnenavn, der skal markeres som visningsværdi (obligatorisk, skal være i kolonner, kan være det samme som nøglen)
Returnerer:
-
NodeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis valideringen mislykkes (dubletkolonner, manglende nøgle/visning osv.)
Noter:
Egenskaber bygges automatisk ud fra kolonnetyper
Kolonnen med tidsfilteret tilføjes automatisk, hvis det er angivet
Egenskabstyper udledes automatisk fra kildeskema
Se Begrænsninger
Eksempel:
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
Afslut denne node, og begynd at oprette en anden node.
Parametre:
-
alias(str): Alias for den nye node
Returnerer:
-
NodeBuilderInitial, ny nodegenerator
Eksempel:
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
Afslut denne node, og begynd at oprette en kant.
Parametre:
-
alias(str): Alias for kanten
Returnerer:
-
EdgeBuilderInitial, ny edge builder
Eksempel:
builder.add_node("user").from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.add_edge("accessed")
done
def done() -> GraphSpec
Afslut denne node, og udfyld grafspecifikationen.
Returnerer:
-
GraphSpec: Fuldstændig grafspecifikation
Eksempel:
graph_spec = builder.add_node("user").from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.done()
Edge Builders
EdgeBuilderInitial
Starttilstand for Edge Builder: Kun tilgængelige datakildemetoder.
Konstruktør
EdgeBuilderInitial(alias: str, graph_builder: GraphSpecBuilder)
Bemærk: Oprettes typisk via GraphSpecBuilder.add_edge(), ikke direkte instantieret.
Metoder
Bemærk!
Brugen af understregningstegn _ ved navngivning af noder, kanter eller egenskaber i et brugerdefineret diagram understøttes ikke. Der returneres en ugyldig anmodningsfejl, når der bruges understregningstegn.
from_table
def from_table(table_name: str, database: Optional[str] = None) -> EdgeBuilderSourceSet
Angiv tabel som datakilde med intelligent databaseopløsning.
Parametre:
-
table_name(str): Navnet på tabellen (påkrævet) -
database(str, valgfrit): Eksplicit databasenavn
Returnerer:
-
EdgeBuilderSourceSet: Generator til yderligere konfiguration
Rejser:
-
ValueError: Hvis tabellen ikke blev fundet, eller der blev fundet flere modstridende tabeller
Eksempel:
builder.add_edge("accessed").from_table("AccessLogs")
from_dataframe
def from_dataframe(dataframe: DataFrame) -> EdgeBuilderSourceSet
Angiv Spark DataFrame som datakilde.
Parametre:
-
dataframe(DataFrame): Spark DataFrame
Returnerer:
-
EdgeBuilderSourceSet: Generator til yderligere konfiguration
Eksempel:
df = spark.read.table("access_logs")
builder.add_edge("accessed").from_dataframe(df)
EdgeBuilderSourceSet
Edge Builder, når datakilden er angivet: tilgængelige konfigurationsmetoder.
Konstruktør
EdgeBuilderSourceSet(alias: str, graph_builder: GraphSpecBuilder, source_step: DataInputETLStep)
Bemærk: Oprettet internt af EdgeBuilderInitial-kildemetoder.
Metoder
with_label
def with_label(label: str) -> EdgeBuilderSourceSet
Angiv kantrelationstype/-navn (som standard alias, hvis det ikke kaldes).
Parametre:
-
label(str): Edge-navn
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis navnet allerede er angivet
Eksempel:
builder.add_edge("rel").from_table("AccessLogs").with_label("ACCESSED")
edge_label
Bemærk!
Brug with_label() i stedet. Denne metode fjernes i en fremtidig version.
def edge_label(label: str) -> EdgeBuilderSourceSet
Angiv kantrelationstype/-navn (som standard alias, hvis det ikke kaldes).
Parametre:
-
label(str): Edge-navn
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis navnet allerede er angivet
Eksempel:
builder.add_edge("acc").from_table("AccessLogs").edge_label("accessed")
source
def source(id_column: str, node_type: str) -> EdgeBuilderSourceSet
Angiv kildenoden med id-kolonne og navn.
Parametre:
-
id_column(str): Kolonnenavn, der indeholder kildenode-id -
node_type(str): Kildenodenavn
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis kilden allerede er angivet
Eksempel:
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
Angiv destinationsnoden med id-kolonne og navn.
Parametre:
-
id_column(str): Kolonnenavn, der indeholder destinationsnodens id -
node_type(str): Destinationsnodenavn
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis destinationen allerede er angivet
Eksempel:
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
Anvend filtrering af tidsinterval på kantens datakilde.
Parametre:
-
time_column(str): Kolonnenavn, der indeholder tidsstempeldata (påkrævet) -
start_time(str eller datetime, valgfrit): Startdato -
end_time(str eller datetime, valgfrit): Slutdato -
lookback_hours(flydende, valgfrit): Timer, der skal kigges tilbage fra nu
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis klokkeslætskolonnen ikke blev fundet i kildeskemaet
Eksempel:
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
Konfigurer kolonner med den påkrævede nøgle og visningsangivelse.
Parametre:
-
*columns(str): Kolonnenavne, der skal medtages (mindst ét påkrævet) -
key(str): Det kolonnenavn, der skal markeres som nøgle (obligatorisk, skal være i kolonner) -
display(str): Det kolonnenavn, der skal markeres som visningsværdi (obligatorisk, skal være i kolonner)
Returnerer:
-
EdgeBuilderSourceSet: Selv for metodekæde
Rejser:
-
ValueError: Hvis valideringen mislykkes
Eksempel:
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
Afslut denne kant, og begynd at oprette en node.
Parametre:
-
alias(str): Alias for den nye node
Returnerer:
-
NodeBuilderInitial, ny nodegenerator
add_edge
def add_edge(alias: str) -> EdgeBuilderInitial
Afslut denne kant, og begynd at bygge en anden kant.
Parametre:
-
alias(str): Alias for den nye kant
Returnerer:
-
EdgeBuilderInitial, ny edge builder
Eksempel:
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
Afslut denne kant, og udfyld grafspecifikationen.
Returnerer:
-
GraphSpec: Fuldstændig grafspecifikation
Skemaklasser
GraphDefinitionReference
Reference til en grafdefinition med navn og version.
Konstruktør
GraphDefinitionReference(
fully_qualified_name: str,
version: str
)
Parametre:
-
fully_qualified_name(str): Fuldt kvalificeret navn på den graf, der henvises til -
version(str): Version af den graf, der henvises til
Rejser:
-
ValueError: Hvis fully_qualified_name eller version er tom
Metoder
to_dict
def to_dict() -> Dict[str, Any]
Serialiser til ordbog.
Returnerer:
-
Dict[str, Any], serialiseret reference
Ejendom
Egenskabsdefinition med grænseflade, der er typesikker.
Konstruktør
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
)
Parametre:
-
name(str): Egenskabsnavn -
property_type(PropertyType): Egenskabsdatatype -
is_non_null(bool, default=False): Om egenskaben er påkrævet -
description(str, default=""): Beskrivelse af egenskab -
is_key(bool, default=False): Om egenskaben er en nøgle -
is_display_value(bool, default=False): Om egenskaben er visningsværdi -
is_internal(bool, default=False): Om egenskaben er intern
Rejser:
-
ValueError: Hvis navnet er tomt, eller valideringen mislykkes
Klassemetoder
key
@classmethod
Property.key(
name: str,
property_type: PropertyType,
description: str = "",
is_non_null: bool = False
) -> Property
Opret en nøgleegenskab med almindelige indstillinger (is_key=Sand, is_display_value=Sand).
display
@classmethod
Property.display(
name: str,
property_type: PropertyType,
description: str = "",
is_non_null: bool = False
) -> Property
Opret en visningsværdiegenskab (is_display_value=Sand).
Metoder
describe
def describe(text: str) -> Property
Tilføj beskrivelsen flydende.
Parametre:
-
text(str): Beskrivelsestekst
Returnerer:
-
Property: Selv for metodekæde
to_dict
def to_dict() -> Dict[str, Any]
Serialiser egenskaben til ordbogen med anmærkningsnøgler med @-præfiks.
Returnerer:
-
Dict[str, Any], serialiseret egenskab
to_gql
def to_gql() -> str
Generér GQL-egenskabsdefinition.
Returnerer:
-
str: GQL-strengrepræsentation
EdgeNode
Nodereference, der bruges i edge-definitioner.
Konstruktør
EdgeNode(
alias: Optional[str] = None,
labels: List[str] = []
)
Parametre:
-
alias(str, valgfrit): Nodealias (automatisk indstillet til første etiket, hvis Ingen eller tom) -
labels(List[str]): Nodenavne (mindst én påkrævet)
Rejser:
-
ValueError: Hvis listen over etiketter er tom -
TypeError: Hvis navne ikke er strenge
Automatisk mutation:
- Hvis aliasset er Ingen eller tomt, angives det til det første navn
Metoder
to_dict
def to_dict() -> Dict[str, Any]
Serialiser til ordbog.
Returnerer:
-
Dict[str, Any]: Serialiseret kantnodereference
Node
Nodedefinition med typesikker grænseflade.
Konstruktør
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
)
Parametre:
-
alias(str, default=""): Nodealias (automatisk indstillet til første etiket, hvis den er tom) -
labels(List[str]): Nodenavne (mindst én påkrævet) -
implies_labels(List[str], default=[]): Implicitte navne -
properties(List[Property], default=[]): Nodeegenskaber -
description(str, default=""): Nodebeskrivelse -
entity_group(str, default=""): Navn på objektgruppe -
dynamic_labels(bool, default=False): Om noden har dynamiske mærkater -
abstract_edge_aliases(bool, default=False): Om noden bruger abstrakte kantaliasser
Rejser:
-
ValueError: Hvis valideringen mislykkes (ingen navne, ingen nøgleegenskab, ingen visningsegenskab osv.)
Automatisk mutation:
- Hvis aliasset er tomt, angives det til det første navn
- Hvis entity_group er tom, angives den til den primære etiket
Metoder
get_primary_label
def get_primary_label() -> Optional[str]
Hent den primære (første) etiket.
Returnerer:
-
strellerNone: Primær etiket eller Ingen, hvis der ikke er nogen navne
get_entity_group_name
def get_entity_group_name() -> str
Hent navnet på objektgruppen, eller gå tilbage til det primære navn.
Returnerer:
-
str, navn på objektgruppe
get_primary_key_property_name
def get_primary_key_property_name() -> Optional[str]
Hent navnet på egenskaben for den primære nøgle.
Returnerer:
-
strellerNone: Navn på egenskab for primær nøgle
get_properties
def get_properties() -> Dict[str, Property]
Få egenskaber som en ordbog, så du nemt kan få adgang til dem.
Returnerer:
-
Dict[str, Property]: Egenskaber med nøgle efter navn
get_property
def get_property(name: str) -> Optional[Property]
Hent en bestemt egenskab efter navn.
Parametre:
-
name(str): Egenskabsnavn
Returnerer:
-
PropertyellerNone: Egenskab, hvis den blev fundet
add_property
def add_property(prop: Property) -> None
Føj en egenskab til denne node.
Parametre:
-
prop(Egenskab): Egenskab, der skal tilføjes
Rejser:
-
ValueError: Hvis egenskabsnavnet er duplikeret
is_dynamically_labeled
def is_dynamically_labeled() -> bool
Kontrollér, om noden har dynamiske navne.
Returnerer:
-
bool: Sand, hvis dynamiske mærkater er aktiveret
is_abstract_edge_node_aliases
def is_abstract_edge_node_aliases() -> bool
Kontrollér, om noden bruger abstrakte kantnodealiasser.
Returnerer:
-
bool: Sand, hvis abstrakte kantaliasser er aktiveret
describe
def describe(text: str) -> Node
Tilføj beskrivelsen flydende.
Parametre:
-
text(str): Beskrivelsestekst
Returnerer:
-
Node: Selv for metodekæde
to_dict
def to_dict() -> Dict[str, Any]
Serialiser noden til ordbogen.
Returnerer:
-
Dict[str, Any], serialiseret node
to_gql
def to_gql() -> str
Generér GQL-nodedefinition.
Returnerer:
-
str: GQL-strengrepræsentation
Rejser:
-
ValueError: Hvis noden mangler obligatoriske felter til GQL
Klassemetoder
create
@classmethod
Node.create(
alias: str,
labels: List[str],
properties: List[Property],
description: str = "",
entity_group: str = "",
**kwargs
) -> Node
Opret en node med alle obligatoriske felter.
Parametre:
-
alias(str): Nodealias -
labels(List[str]): Nodenavne -
properties(List[Property]): Nodeegenskaber -
description(str, default=""): Nodebeskrivelse -
entity_group(str, default=""): Navn på objektgruppe
Returnerer:
-
Node, ny nodeforekomst
Kant
Edge-definition med typesikker grænseflade.
Konstruktør
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
)
Parametre:
-
relationship_type(str): Edge-relationstype (f.eks. "FØLGER", "OWNS") -
source_node_label(str): Kildenodenavn -
target_node_label(str): Destinationsnodenavn -
direction(EdgeDirection, default=DIRECTED_RIGHT): Kantretning -
properties(List[Property], default=[]): Edge-egenskaber -
description(str, default=""): Edge-beskrivelse -
entity_group(str, default=""): Navn på objektgruppe -
dynamic_type(bool, default=False): Om kant har dynamisk type
Rejser:
-
ValueError: Hvis valideringen mislykkes
Automatisk mutation:
-
labelsudfyldes automatisk med[relationship_type] - Hvis entity_group er tom, angives den til relationship_type
Egenskaber
edge_type
def edge_type() -> str
Alias for bagudkompatibilitet for relationship_type.
Returnerer:
-
str, relationstype
Metoder
get_entity_group_name
def get_entity_group_name() -> str
Hent navnet på objektgruppen, eller gå tilbage til relationstypen.
Returnerer:
-
str, navn på objektgruppe
is_dynamic_type
def is_dynamic_type() -> bool
Kontrollér, om kant har dynamisk type.
Returnerer:
-
bool: Sand, hvis dynamisk type
add_property
def add_property(edge_property: Property) -> None
Føj en egenskab til denne kant.
Parametre:
-
edge_property(Egenskab): Egenskab, der skal tilføjes
describe
def describe(text: str) -> Edge
Tilføj beskrivelsen flydende.
Parametre:
-
text(str): Beskrivelsestekst
Returnerer:
-
Edge: Selv for metodekæde
to_dict
def to_dict() -> Dict[str, Any]
Serialiser kant til ordbog.
Returnerer:
-
Dict[str, Any], serialiseret kant
to_gql
def to_gql() -> str
Generér GQL-edgedefinition.
Returnerer:
-
str: GQL-strengrepræsentation
Klassemetoder
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
Opret en kant med alle obligatoriske felter.
Parametre:
-
relationship_type(str): Edge-relationstype -
source_node_label(str): Kildenodenavn -
target_node_label(str): Destinationsnodenavn -
properties(List[Property], valgfrit): Edge-egenskaber -
description(str, default=""): Edge-beskrivelse -
entity_group(str, default=""): Navn på objektgruppe
Returnerer:
-
Edge: Ny edge-forekomst
GraphSchema
Grafskemadefinition med typesikker grænseflade.
Konstruktør
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 = ""
)
Parametre:
-
name(str): Diagramskemanavn -
nodes(List[Node], default=[]): Nodedefinitioner -
edges(List[Edge], default=[]): Edge-definitioner -
base_graphs(List[GraphSchema], default=[]): Basisgrafskemaer -
description(str, default=""): Skemabeskrivelse -
version(str, default="1.0"): Skemaversion -
fully_qualified_name(str, default=""): Fuldt kvalificeret navn -
namespace(str, default=""): Navneområde
Rejser:
-
ValueError: Hvis valideringen mislykkes (dubletaliasser, kanter refererer til ikke-eksisterende noder osv.)
Metoder
get_fully_qualified_name
def get_fully_qualified_name() -> str
Hent det fuldt kvalificerede navn.
Returnerer:
-
str, fuldt kvalificeret navn
get_namespace
def get_namespace() -> str
Hent navneområde fra fuldt kvalificeret navn, eller returner standard.
Returnerer:
-
str:Navneområde
get_version
def get_version() -> str
Hent version.
Returnerer:
-
str, versionsstreng
get_node
def get_node(label_or_alias: str) -> Optional[Node]
Hent node efter navn eller alias.
Parametre:
-
label_or_alias(str): Nodenavn eller -alias
Returnerer:
-
NodeorNone: Node, hvis fundet
get_edge
def get_edge(name: str) -> Optional[Edge]
Hent kant efter navn/type.
Parametre:
-
name(str): Edge-relationstype
Returnerer:
-
EdgeellerNone: Edge, hvis den findes
add_node
def add_node(node: Node) -> None
Føj en node til denne graf.
Parametre:
-
node(Node): Node, der skal tilføjes
Rejser:
-
ValueError: Hvis nodealiaset er dublet
add_edge
def add_edge(edge: Edge) -> None
Føj en kant til denne graf.
Parametre:
-
edge(Edge): Kant, der skal tilføjes
Rejser:
-
ValueError: Hvis kanttypen er duplikeret
include_graph
def include_graph(fully_qualified_name: str, version: str) -> GraphSchema
Tilføj en graf include (flydende API).
Parametre:
-
fully_qualified_name(str): Fuldt kvalificeret navn på grafen, der skal medtages -
version(str): Version af graf, der skal medtages
Returnerer:
-
GraphSchema: Selv for metodekæde
get_included_graph_references
def get_included_graph_references() -> List[GraphDefinitionReference]
Hent en liste over inkluderede grafreferencer.
Returnerer:
-
List[GraphDefinitionReference]: Liste over grafdefinitionsreferencer
describe
def describe(text: str) -> GraphSchema
Tilføj beskrivelsen flydende.
Parametre:
-
text(str): Beskrivelsestekst
Returnerer:
-
GraphSchema: Selv for metodekæde
to_dict
def to_dict() -> Dict[str, Any]
Serialiser skema til ordbog.
Returnerer:
-
Dict[str, Any], serialiseret skema
to_json
def to_json(indent: int = 2) -> str
Generér JSON-repræsentation.
Parametre:
-
indent(int, default=2): JSON-indrykningsniveau
Returnerer:
-
str, JSON-streng
to_gql
def to_gql() -> str
Generér GQL-skemadefinition.
Returnerer:
-
str: GQL-strengrepræsentation
Klassemetoder
create
@classmethod
GraphSchema.create(
name: str,
nodes: List[Node] = None,
edges: List[Edge] = None,
description: str = "",
version: str = "1.0",
**kwargs
) -> GraphSchema
Opret et grafskema med alle obligatoriske felter.
Parametre:
-
name(str): Diagramskemanavn -
nodes(List[Node], valgfrit): Nodedefinitioner -
edges(List[Edge], valgfrit): Edge-definitioner -
description(str, default=""): Skemabeskrivelse -
version(str, default="1.0"): Skemaversion
Returnerer:
-
GraphSchema: Ny diagramskemaforekomst
Forespørgselsinputklasser
Dataklassificeringer, der repræsenterer inputparametre for foruddefinerede grafforespørgsler.
Bemærk!
Overførsel af QueryInput objekter direkte til Graph forespørgselsmetoder frarådes og fjernes i fremtidige versioner.
Brug nøgleordsargumenter i stedet. Metoderne Graph (reachability, k_hop, blast_radius, centralityranked) accepterer alle parametre som nøgleordsargumenter og konstruerer inputobjekterne internt. Disse klasser forbliver i kodebasen i øjeblikket, men bør ikke bruges i ny kode.
QueryInputBase
Basisklasse for alle forespørgselsinputparametre.
Metoder
to_json_payload
def to_json_payload() -> Dict[str, Any]
Konvertér inputparametrene til en ordbog til INDSENDELSE AF API.
Returnerer:
-
Dict[str, Any]: Ordbogsrepræsentation af inputparametrene
validate
def validate() -> None
Valider inputparametrene.
Rejser:
-
ValueError: Hvis inputparametrene er ugyldige
ReachabilityQueryInput
Inputparametre for en forespørgsel om rækkevidde mellem kilde- og destinationsnoder.
Arver fra ReachabilityQueryInputBase , som nedarver fra QueryInputBase.
Felter
| Feltet | Type | Standard | Beskrivelse |
|---|---|---|---|
source_property_value |
str |
(påkrævet) | Værdi, der svarer til kildeegenskaben |
target_property_value |
str |
(påkrævet) | Værdi, der svarer til destinationsegenskaben |
source_property |
Optional[str] |
None |
Egenskabsnavn til filtrering af kildenoder |
participating_source_node_labels |
Optional[List[str]] |
None |
Nodenavne, der skal betragtes som kildenoder |
target_property |
Optional[str] |
None |
Egenskabsnavn til filtrering af destinationsnoder |
participating_target_node_labels |
Optional[List[str]] |
None |
Nodemærkater, der skal betragtes som destinationsnoder |
participating_edge_labels |
Optional[List[str]] |
None |
Edge-mærkater, der skal gennemgås i stien |
is_directional |
Optional[bool] |
True |
Om kanterne er retningsbestemt |
min_hop_count |
Optional[int] |
1 |
Mindste antal hop i stien |
max_hop_count |
Optional[int] |
4 |
Maksimalt antal hop i stien |
shortest_path |
Optional[bool] |
False |
Om du kun vil finde den korteste sti |
max_results |
Optional[int] |
500 |
Det maksimale antal resultater, der skal returneres |
Validering:
-
source_property_valueer påkrævet -
target_property_valueer påkrævet
Eksempel:
# 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
Inputparametre for en k-hop-forespørgsel fra en given kildenode.
Arver fra ReachabilityQueryInputBase.
Arver alle felter fra ReachabilityQueryInput.
Validering:
- Der skal angives mindst én af
source_property_valueellertarget_property_value
Eksempel:
# 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
Inputparametre for en forespørgsel med en blast radius fra kilde til destinationsnoder.
Arver fra ReachabilityQueryInputBase.
Arver alle felter fra ReachabilityQueryInputmed følgende obligatoriske felter:
| Feltet | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
source_property_value |
str |
Ja | Værdi, der identificerer kildenoden |
target_property_value |
str |
Ja | Værdi, der identificerer destinationsnoden |
Validering:
-
source_property_valueer påkrævet -
target_property_valueer påkrævet
Eksempel:
# 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
Inputparametre for en centralitetsanalyseforespørgsel.
Arver fra QueryInputBase.
CentralityType-optælling
| Værdi | Beskrivelse |
|---|---|
CentralityType.Node |
Centralitet for beregningsnoden |
CentralityType.Edge |
Centralitet for beregningskant |
Felter
| Feltet | Type | Standard | Beskrivelse |
|---|---|---|---|
threshold |
Optional[int] |
3 |
Mindste centralitetsscore, der skal overvejes |
centrality_type |
CentralityType |
CentralityType.Node |
Type centralitet, der skal beregnes |
max_paths |
Optional[int] |
1000000 |
Det maksimale antal stier, der skal overvejes (0 = alle) |
participating_source_node_labels |
Optional[List[str]] |
None |
Kildenodenavne |
participating_target_node_labels |
Optional[List[str]] |
None |
Destinationsnodenavne |
participating_edge_labels |
Optional[List[str]] |
None |
Edge-mærkater, der skal gennemgås |
is_directional |
Optional[bool] |
True |
Angiver, om kanterne er retningsbestemt |
min_hop_count |
Optional[int] |
1 |
Minimumhop |
max_hop_count |
Optional[int] |
4 |
Maksimalt antal hop |
shortest_path |
Optional[bool] |
False |
Kun korteste stier |
max_results |
Optional[int] |
500 |
Maksimalt antal resultater |
Eksempel:
# 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"]
))
RankedQueryInput
Inputparametre for en rangeret analyseforespørgsel.
Arver fra QueryInputBase.
Felter
| Feltet | Type | Standard | Beskrivelse |
|---|---|---|---|
rank_property_name |
str |
(påkrævet) | Egenskabsnavn, der skal bruges til rangeringsstier |
threshold |
Optional[int] |
0 |
Returner kun stier med vægte over denne værdi |
max_paths |
Optional[int] |
1000000 |
Det maksimale antal stier, der skal overvejes (0 = alle) |
decay_factor |
Optional[float] |
1 |
Hvor meget hvert graftrin reducerer rangering (2 = halvdelen af hvert trin) |
is_directional |
Optional[bool] |
True |
Angiver, om kanterne er retningsbestemt |
min_hop_count |
Optional[int] |
1 |
Minimumhop |
max_hop_count |
Optional[int] |
4 |
Maksimalt antal hop |
shortest_path |
Optional[bool] |
False |
Kun korteste stier |
max_results |
Optional[int] |
500 |
Maksimalt antal resultater |
Eksempel:
# 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
))
Forespørgselsresultater
Forespørgselsresultat
Resultatet af en grafforespørgsel med doven DataFrame-adgang.
Konstruktør
QueryResult(raw_response: Dict[str, Any], graph: Graph)
Parametre:
-
raw_response(Dict[str, Any]): Raw API-svarordbog -
graph(Graf): Reference til overordnet graf
Bemærk: Oprettes typisk af Graph.query(), ikke direkte instantieret.
Metoder
to_dataframe
def to_dataframe() -> DataFrame
Konverterer forespørgselsresultatet til en Spark DataFrame.
Returnerer:
-
DataFrame, forespørgselsresultat som Spark DataFrame
Rejser:
-
ValueError: Hvis konverteringen mislykkes
Eksempel:
result = graph.query("MATCH (u:user) RETURN u")
df = result.to_dataframe()
df.show()
get_raw_data
def get_raw_data() -> Dict[str, Any]
Hent afsnittet RawData fra svaret.
Returnerer:
-
Dict[str, Any]: Ordbog med rå metadata eller tom dikt, hvis den ikke findes
Eksempel:
result = graph.query("MATCH (u:user) RETURN u")
metadata = result.get_raw_data()
show
def show(format: str = "visual") -> None
Vis forespørgselsresultatet i forskellige formater.
Parametre:
-
format(str, default="visual"): Outputformat-
"table", komplette DataFrame-tabeller (alle kolonner) -
"visual": Interaktiv grafvisualisering med VSC-plug-in -
"all": Vis alle formater
-
Rejser:
-
ValueError: Hvis format ikke er en af de understøttede værdier
Eksempel:
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
Komplet eksempel (anbefalet – v0.3+)
# 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()
Noter om designmønstre
Flydende API
Alle udviklere understøtter sammenkædning af metoder for læsbare, deklarative grafdefinitioner:
builder.add_node("user") \
.from_table("Users") \
.with_columns("id", "name", key="id", display="name") \
.add_edge("follows")
Foreningsskemaer
Flere kanter med det samme alias foreningsopereres automatisk med flettede egenskaber:
# 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")
Automatisk konfiguration
Mange felter har fornuftige standarder:
- Node-/kantnavne bruger som standard deres aliasser
- Egenskaber udledes automatisk fra kildeskemaer
- Objektgrupper bruger som standard primære navne/relationstyper
Doven evaluering
DataFrames og ressourcer indlæses dovent og cachelagres:
-
graph_spec.nodesoggraph_spec.edgesindlæses ved første adgang - Forespørgselsresultater opretter kun datarammer, når der anmodes om det