# Data Cataloging and Discovery

**Last updated:** 2026-02
**Status:** GA
**Category:** Data Engineering for AI

---

## Introduksjon

Datakatalogisering og oppdagelse er fundamentale kapabiliteter for organisasjoner som bygger AI-løsninger. Uten en systematisk tilnærming til å registrere, beskrive og finne data, risikerer AI-team å bruke uforholdsmessig mye tid på å lete etter relevante datasett, duplisere eksisterende arbeid, eller trene modeller på data av ukjent kvalitet og opprinnelse. Microsoft Purview Unified Catalog er Microsofts svar på denne utfordringen -- en sentral plattform for å organisere, oppdage og forstå data på tvers av hele dataeiendommen.

For norsk offentlig sektor er datakatalogisering spesielt viktig gitt kravene i Forvaltningsloven om dokumentasjon, Digdirs prinsipper for informasjonsforvaltning, og den nasjonale strategien for deling av data. Purview Unified Catalog støtter disse kravene gjennom governance domains, data products, business glossary og rollebasert tilgangsstyring som mapper til norske forvaltningsprinsipper.

Denne referansen dekker asset-registrering og metadata-berikelse, søk- og oppdagelsesgrensesnitt, forretningsglossarer og taksonomier, dataeier- og forvalteroppdrag, samt bruksanalyse og popularitetsmetrikker for AI-datasett i Microsoft Purview.

---

## Asset Registration and Metadata Enrichment

### Registrering av datakilder i Purview

Asset-registrering er det første steget for å gjøre data oppdagbare. Purview støtter automatisk skanning av et bredt spekter av datakilder:

| Kildetype | Eksempler | Skanningsmetode |
|---|---|---|
| **Microsoft Fabric** | Lakehouse, Warehouse, KQL DB, Notebooks, Pipelines, Power BI | Automatisk ved Fabric-tenant-skanning |
| **Azure Data** | SQL Database, ADLS Gen2, Cosmos DB, Synapse | Registrering + planlagt skanning |
| **On-premises** | SQL Server, Oracle, file shares | Self-hosted Integration Runtime |
| **SaaS** | Dataverse, Salesforce, SAP | Registrering + connector-basert skanning |
| **Multi-cloud** | AWS S3, Google BigQuery | Cross-cloud connectors |

### Fabric-spesifikk registrering

```
Fabric Tenant Scanning:

1. Purview Portal > Unified Catalog > Catalog Management
2. Registrer Microsoft Fabric som datakilde
3. Konfigurer skanning:
   - Velg workspaces (alle eller spesifikke)
   - Planlegg skanningsfrekvens
   - Konfigurer autentisering (Managed Identity)
4. Etter skanning er følgende tilgjengelig:

Inventerte Fabric-elementer:
┌────────────────────────────────────────────────┐
│ Opplevelse        │ Registrerte elementer       │
├────────────────────────────────────────────────┤
│ Data Engineering   │ Lakehouse, Notebook,        │
│                    │ Spark Job Def, SQL Endpoint  │
├────────────────────────────────────────────────┤
│ Data Factory       │ Data Pipeline, Dataflow Gen2 │
├────────────────────────────────────────────────┤
│ Data Science       │ Experiment, ML Model         │
├────────────────────────────────────────────────┤
│ Data Warehouse     │ Warehouse                    │
├────────────────────────────────────────────────┤
│ Real-Time Analytics│ KQL Database, KQL Queryset   │
├────────────────────────────────────────────────┤
│ Power BI           │ Semantic Model, Report,      │
│                    │ Dashboard, Dataflow, Datamart │
└────────────────────────────────────────────────┘
```

### Metadata-berikelse

Etter registrering kan metadata berikes manuelt eller automatisk:

```python
# Bruk Purview REST API for å berike metadata på assets
import requests

purview_endpoint = "https://<account>.purview.azure.com"
headers = {"Authorization": f"Bearer {access_token}"}

# Hent eksisterende asset
asset_response = requests.get(
    f"{purview_endpoint}/catalog/api/atlas/v2/entity/guid/{asset_guid}",
    headers=headers
)
asset = asset_response.json()

# Legg til forretningsbeskrivelse og egendefinerte attributter
asset["entity"]["attributes"]["userDescription"] = (
    "Kundetransaksjonstabell for ML-treningsdata. "
    "Inneholder 12 måneders historikk for churn-prediksjon. "
    "Oppdateres daglig via inkrementell lasting."
)

# Oppdater asset med berikede metadata
update_response = requests.put(
    f"{purview_endpoint}/catalog/api/atlas/v2/entity",
    headers=headers,
    json={"entity": asset["entity"]}
)
```

### Automatisk klassifisering og tagging

Purview skanner innholdet i datakolonner og tildeler automatiske klassifiseringer:

| Klassifiseringstype | Eksempler | Handling |
|---|---|---|
| **Norsk PII** | Fødselsnummer (11 siffer) | Auto-merking som "Fortrolig" |
| **Finansiell** | Kontonummer, IBAN | Varsling til dataeier |
| **Helse** | Diagnosekoder (ICD-10) | Eskalering til DPO |
| **Kontaktinfo** | E-post, telefonnummer | Krever samtykke-validering |
| **Autentisering** | API-nøkler, passord | Umiddelbar sikkerhetsvarsling |

```python
# Programmatisk klassifiseringsrapport for AI-datasett
def get_classification_report(purview_endpoint, token):
    """Generer rapport over klassifiserte assets for AI-treningsdata."""
    url = f"{purview_endpoint}/catalog/api/search/query"
    headers = {"Authorization": f"Bearer {token}"}

    classifications = [
        "MICROSOFT.GOVERNMENT.NORWAY.NATIONAL.ID.NUMBER",
        "MICROSOFT.FINANCIAL.CREDIT_CARD_NUMBER",
        "MICROSOFT.PERSONAL.EMAIL",
        "MICROSOFT.PERSONAL.PHONE_NUMBER"
    ]

    report = {}
    for classification in classifications:
        body = {
            "keywords": "*",
            "filter": {
                "classification": classification,
                "assetType": "azure_datalake_gen2_path"
            },
            "limit": 100
        }
        response = requests.post(url, headers=headers, json=body)
        results = response.json()
        report[classification] = {
            "count": results.get("@search.count", 0),
            "assets": [a["name"] for a in results.get("value", [])]
        }

    return report

# Eksempel output:
# {
#   "NORWAY.NATIONAL.ID.NUMBER": {"count": 15, "assets": [...]},
#   "CREDIT_CARD_NUMBER": {"count": 3, "assets": [...]},
#   ...
# }
```

---

## Search and Discovery Interfaces

### Purview Unified Catalog søkegrensesnitt

Unified Catalog tilbyr flere oppdagelsesmekanismer for å finne data:

| Oppdagelsesmetode | Beskrivelse | Beste for |
|---|---|---|
| **Nøkkelordsøk** | Fritekst-søk på tvers av katalogen | Kjent datasett-navn |
| **Naturlig språk (preview)** | AI-drevet søk med forretningskontekst | Utforskende oppdagelse |
| **Governance domain-browsing** | Naviger etter forretningsdomene | Organisasjonsstruktur |
| **Data product-søk** | Finn kuraterte datasett-pakker | AI-klare datasett |
| **Filtreringsbasert** | Filtrering på attributter, eiere, labels | Målrettet søk |

### Naturlig språk-søk

```
Eksempler på naturlig språk-søk (preview):

Søk: "Jeg trenger tre år med trafikkdata fra Statens vegvesen
       for å analysere rushtrafikk-mønstre"
Resultat: Data products med trafikktelledata, reisehastighetsmålinger

Søk: "Finn sertifiserte kundedata med kundeID, navn og adresse"
Resultat: Data products med masterdata for kunder

Søk: "Vis meg Power BI-rapporter om tilstandsdata for broer"
Resultat: Rapporter og underliggende datasett for bro-tilstand

Søk: "Jeg jobber med prediktiv vedlikehold.
       Vis sensordata fra veisensorer"
Resultat: IoT-sensordata, vedlikeholdshistorikk-datasett
```

### Søkearkitektur

```
┌────────────────────────────────────────────────────────┐
│                 Purview Unified Catalog                  │
│                                                          │
│  ┌─────────────┐  ┌─────────────┐  ┌──────────────┐   │
│  │ Keyword     │  │ Natural     │  │ Browse by    │   │
│  │ Search      │  │ Language    │  │ Domain       │   │
│  │             │  │ (preview)   │  │              │   │
│  └──────┬──────┘  └──────┬──────┘  └──────┬───────┘   │
│         │                │                │             │
│         └────────────────┼────────────────┘             │
│                          │                               │
│              ┌───────────▼────────────┐                 │
│              │   Search Index          │                 │
│              │   (Data Map metadata)   │                 │
│              └───────────┬────────────┘                 │
│                          │                               │
│         ┌────────────────┼────────────────┐             │
│         │                │                │             │
│  ┌──────▼──────┐  ┌─────▼──────┐  ┌─────▼──────┐     │
│  │ Data Assets │  │ Data       │  │ Glossary   │     │
│  │ (tabeller,  │  │ Products   │  │ Terms      │     │
│  │  filer)     │  │            │  │            │     │
│  └─────────────┘  └────────────┘  └────────────┘     │
│                                                          │
│  Søkeattributter:                                        │
│  - Asset-navn, beskrivelse, forretningsbruk              │
│  - Governance domain-navn og beskrivelse                  │
│  - Glossary term-navn og definisjoner                     │
│  - Data product tilknyttede assets                       │
│  - OKR-er og kritiske dataelementer                      │
└────────────────────────────────────────────────────────┘
```

### Filtrering og fasettert søk

```python
# Programmatisk søk i Purview Catalog
def search_catalog(purview_endpoint, token, query, filters=None):
    """Søk i Purview-katalogen med valgfrie filtre."""
    url = f"{purview_endpoint}/catalog/api/search/query"
    headers = {"Authorization": f"Bearer {token}"}

    body = {
        "keywords": query,
        "limit": 25,
        "offset": 0,
        "orderby": [{"name": "ASC"}]
    }

    # Legg til filtre
    if filters:
        body["filter"] = filters

    response = requests.post(url, headers=headers, json=body)
    return response.json()

# Eksempel: Finn alle Lakehouse-tabeller i et spesifikt workspace
results = search_catalog(
    endpoint, token,
    query="customer transactions",
    filters={
        "and": [
            {"entityType": "azure_datalake_gen2_path"},
            {"classification": "MICROSOFT.PERSONAL.NAME"},
            {"label": "Fortrolig"}
        ]
    }
)

# Vis resultater med relevans-score
for item in results.get("value", []):
    print(f"Navn: {item['name']}")
    print(f"  Type: {item['entityType']}")
    print(f"  Kvalifisert navn: {item['qualifiedName']}")
    print(f"  Eier: {item.get('owner', 'Ukjent')}")
    print(f"  Score: {item.get('@search.score', 'N/A')}")
    print(f"  Beskrivelse: {item.get('description', 'Ingen')[:100]}")
    print()
```

---

## Business Glossaries and Taxonomies

### Forretningsglossar i Unified Catalog

Business glossary knytter forretningsvokabular til tekniske assets, noe som er kritisk for at domeneeksperter skal finne relevante data for AI-prosjekter:

| Komponent | Funksjon | AI-relevans |
|---|---|---|
| **Glossary Terms** | Forretningsdefinisjoner knyttet til data | Feature-forståelse for ML |
| **Synonymer** | Alternative termer for samme begrep | Bedre søkeresultater |
| **Akronymer** | Forkortelser og initialord | Standardisering |
| **Hierarki (Parent/child)** | Taksonomisk organisering | Domene-navigering |
| **Custom Attributes** | Egendefinerte metadata-felter | Prosjektspesifikk kontekst |
| **Ressurser** | Lenker til dokumentasjon | Kontekstuell informasjon |

### Glosarstruktur for AI-prosjekter

```
Governance Domain: "AI og Maskinlæring"
├── Glossary Terms
│   ├── "Treningsdata"
│   │   ├── Definisjon: "Datasett brukt til å trene ML-modeller"
│   │   ├── Synonymer: "Training data", "Opplæringsdata"
│   │   ├── Relaterte termer: "Valideringsdata", "Testdata"
│   │   ├── Tilknyttede assets: bronze.raw_*, silver.validated_*
│   │   └── Policy: Krever dataeier-godkjenning
│   │
│   ├── "Feature"
│   │   ├── Definisjon: "Beregnet variabel brukt som input til ML-modell"
│   │   ├── Synonymer: "Prediktor", "Forklaringsvariabel"
│   │   ├── Sub-termer:
│   │   │   ├── "Numerisk feature"
│   │   │   ├── "Kategorisk feature"
│   │   │   └── "Temporal feature"
│   │   └── Tilknyttede assets: gold.customer_features
│   │
│   ├── "Ground Truth"
│   │   ├── Definisjon: "Verifisert korrekt label for supervised learning"
│   │   ├── Kvalitetskrav: "Minst 2 uavhengige annotører"
│   │   └── Policy: Krever kvalitetsscore >= 95%
│   │
│   ├── "Personopplysning"
│   │   ├── Definisjon: "Opplysning som kan knyttes til identifiserbar person"
│   │   ├── Akronym: "PII"
│   │   ├── Regulering: GDPR Art. 4(1)
│   │   └── Policy: Automatisk anonymisering i ML-pipelines
│   │
│   └── "Modelldrift"
│       ├── Definisjon: "Endring i modellytelse over tid"
│       ├── Synonymer: "Model drift", "Concept drift"
│       └── Tilknyttede assets: monitoring.drift_metrics

Governance Domain: "Veiforvaltning"
├── Glossary Terms
│   ├── "AADT"
│   │   ├── Definisjon: "Årsdøgntrafikk - gjennomsnittlig daglig trafikk"
│   │   ├── Synonym: "Annual Average Daily Traffic"
│   │   └── Tilknyttede assets: traffic.aadt_measurements
│   │
│   ├── "ÅDT"
│   │   ├── Definisjon: "Døgntrafikk for et enkelt år"
│   │   └── Relatert: "AADT"
│   │
│   └── "Tilstandsgrad"
│       ├── Definisjon: "Skala 0-5 for tilstandsvurdering av veiobjekter"
│       ├── Sub-termer:
│       │   ├── "TG0 - Ingen avvik"
│       │   ├── "TG1 - Mindre avvik"
│       │   ├── "TG2 - Moderate avvik"
│       │   └── "TG3 - Alvorlige avvik"
│       └── Tilknyttede assets: nvdb.condition_assessments
```

### Opprette glossary terms programmatisk

```python
# Opprett glossary terms via Purview REST API
def create_glossary_term(purview_endpoint, token, term_data):
    """Opprett en ny glossary term i Purview Unified Catalog."""
    url = f"{purview_endpoint}/catalog/api/atlas/v2/glossary/term"
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }

    payload = {
        "name": term_data["name"],
        "qualifiedName": f"{term_data['name']}@Glossary",
        "longDescription": term_data["definition"],
        "abbreviation": term_data.get("abbreviation"),
        "anchor": {
            "glossaryGuid": term_data["glossary_guid"]
        },
        "attributes": {
            "dataOwner": term_data.get("owner"),
            "regulatoryRequirement": term_data.get("regulation")
        }
    }

    response = requests.post(url, headers=headers, json=payload)
    return response.json()

# Eksempel: Batch-opprett termer for AI-domenet
ai_terms = [
    {
        "name": "Treningsdata",
        "definition": "Datasett brukt til å trene ML-modeller. "
                       "Skal være representativt for populasjonen modellen "
                       "skal predikere på.",
        "abbreviation": "TD",
        "glossary_guid": ai_glossary_guid,
        "owner": "ml-team@vegvesen.no",
        "regulation": "GDPR Art. 6 - Lovlig behandlingsgrunnlag"
    },
    {
        "name": "Feature Store",
        "definition": "Sentralisert repository for beregning, lagring og "
                       "servering av ML-features med punkt-i-tid korrekthet.",
        "glossary_guid": ai_glossary_guid,
        "owner": "data-engineering@vegvesen.no"
    },
    {
        "name": "Dataminimering",
        "definition": "Prinsipp om at kun nødvendige personopplysninger "
                       "samles inn og behandles. Hjemlet i GDPR Art. 5(1)(c).",
        "glossary_guid": ai_glossary_guid,
        "regulation": "GDPR Art. 5(1)(c)"
    }
]

for term in ai_terms:
    result = create_glossary_term(endpoint, token, term)
    print(f"Opprettet: {result['name']} (GUID: {result['guid']})")
```

### Taksonomisk hierarki

```
Hierarki-visning i Purview:
Unified Catalog > Catalog Management > Governance Domains > Glossary Terms

Visningsalternativer:
├── Liste-visning    -- Flat liste med sortering
├── Kompakt liste    -- Fortetting for oversikt
└── Tre-visning      -- Hierarkisk parent/child-struktur

Eksempel tre-visning:
Data
├── Strukturert data
│   ├── Relasjonell data
│   │   ├── Transaksjonstabell
│   │   └── Dimensjonstabell
│   └── Tidsseriedata
│       ├── Sensordata
│       └── Hendelsesdata
├── Semi-strukturert data
│   ├── JSON-dokumenter
│   └── XML-meldinger
└── Ustrukturert data
    ├── Tekst
    │   ├── Fritekst-notater
    │   └── E-postkorrespondanse
    └── Bilder
        ├── Satellittbilder
        └── Inspeksjonsfoto
```

---

## Data Owner and Steward Assignments

### Roller i Purview Unified Catalog

Purview definerer tydelige roller for datastyring som mapper til norske forvaltningsmønstre:

| Rolle | Purview-navn | Rettigheter | Norsk ekvivalent |
|---|---|---|---|
| **Global Catalog Reader** | Unified Catalog Reader | Les publiserte artefakter | Innsyn |
| **Local Catalog Reader** | Domain-spesifikk leser | Les innenfor et domene | Saksbehandler |
| **Governance Domain Creator** | Domain Creator | Opprette domener | Avdelingsleder |
| **Data Product Owner** | Product Owner | Opprette/oppdatere data products | Fagansvarlig |
| **Data Steward** | Steward | Opprette glossary terms, policies | Informasjonsforvalter |
| **Data Health Reader** | Health Reader | Les helserapporter | Controller |
| **Data Profile Reader** | Profile Reader | Se profileringsinnsikt | Analytiker |

### Rollebasert tilgangsmodell

```
Governance Domain: "AI og Maskinlæring"
│
├── Domain Owner: Seksjonsleder AI-avdelingen
│   - Rettigheter: Full kontroll over domenet
│   - Ansvar: Strategisk retning, delegering
│
├── Data Stewards: Informasjonsforvaltere
│   - Rettigheter: Opprette/redigere glossary terms, policies
│   - Ansvar: Datakvalitet, klassifisering, compliance
│
├── Data Product Owners: ML-ingeniører
│   - Rettigheter: Opprette/oppdatere data products
│   - Ansvar: Kuratere AI-klare datasett
│
└── Catalog Readers: Dataforskere, analytikere
    - Rettigheter: Søke, browse, be om tilgang
    - Ansvar: Finne og bruke data ansvarlig
```

### Tilordne eiere og forvaltere

```python
# Tilordne dataeier via Purview REST API
def assign_data_owner(purview_endpoint, token, asset_guid, owner_info):
    """Tilordne dataeier til et asset i Purview."""
    url = f"{purview_endpoint}/catalog/api/atlas/v2/entity/guid/{asset_guid}"
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }

    # Hent eksisterende asset
    response = requests.get(url, headers=headers)
    asset = response.json()

    # Oppdater eierskap
    asset["entity"]["attributes"]["owner"] = owner_info["email"]

    # Legg til kontakt-metadata
    contacts = asset["entity"].get("contacts", {})
    contacts["Owner"] = [{
        "id": owner_info["aad_object_id"],
        "info": owner_info["email"]
    }]
    contacts["Expert"] = [{
        "id": owner_info.get("expert_aad_id"),
        "info": owner_info.get("expert_email")
    }]
    asset["entity"]["contacts"] = contacts

    # Oppdater asset
    update_response = requests.put(
        f"{purview_endpoint}/catalog/api/atlas/v2/entity",
        headers=headers,
        json={"entity": asset["entity"]}
    )
    return update_response.json()

# Eksempel: Tilordne eierskap for ML-datasett
assign_data_owner(endpoint, token, gold_features_guid, {
    "email": "ml-team@vegvesen.no",
    "aad_object_id": "abc-123-def",
    "expert_email": "data-scientist@vegvesen.no",
    "expert_aad_id": "ghi-456-jkl"
})
```

### Governance Domain-oppsett for AI

```
Oppsett av Governance Domain for AI-prosjekter:

1. Opprett domene:
   Purview Portal > Unified Catalog > Catalog Management > Governance Domains
   - Navn: "AI og Maskinlæring"
   - Type: Functional Unit
   - Beskrivelse: "Datastyring for alle AI/ML-initiativer"

2. Tilordne roller:
   - Domain Owner: AI-seksjonsleder
   - Stewards: Informasjonsforvaltere (2-3 personer)
   - Data Product Owners: ML-ingeniører per prosjekt

3. Konfigurer data estate mappings:
   - Map til Data Map-samlinger med AI-relaterte assets
   - Inkluder Fabric workspaces for ML

4. Opprett data products:
   - "Customer 360 for Churn" -- Kundedatasett for churn-prediksjon
   - "Traffic Sensor Features" -- Sensordata for trafikkanalyse
   - "Bridge Condition ML Set" -- Bro-tilstandsdata for vedlikeholds-ML

5. Definer glossary terms:
   - AI-spesifikke termer (se seksjon over)
   - Domenespesifikke termer (vei, trafikk, infrastruktur)

6. Sett OKR-er:
   - "90% av AI-datasett har dokumentert eierskap innen Q2"
   - "100% av datasett med PII er klassifisert"
   - "Gjennomsnittlig tid til data-oppdagelse < 15 min"
```

---

## Usage Analytics and Popularity Metrics

### Data Estate Health og Insights

Purview tilbyr analytikk for å forstå hvordan data brukes på tvers av organisasjonen:

| Metrikk | Kilde | AI-relevans |
|---|---|---|
| **Skanningsdekning** | Data Map skanning | Andel registrerte AI-datakilder |
| **Klassifiseringsdekning** | Auto-klassifisering | Andel klassifisert treningsdata |
| **Glossary-tilknytning** | Business glossary | Andel assets med forretningskontekst |
| **Eierskap** | Kontakter/eiere | Andel assets med definert eier |
| **Health Score** | Health Controls | Samlet governance-modenhet |
| **Data Quality Score** | Data Quality rules | Datakvalitet per domene |

### Health Controls og Health Actions

```
Purview Health Management:

Health Controls (automatisk evaluering):
┌─────────────────────────────────────────────────────┐
│ Kontroll                    │ Mål   │ Status        │
├─────────────────────────────────────────────────────┤
│ Assets med eier             │ > 90% │ ✓ 92%        │
│ Assets med beskrivelse      │ > 80% │ ⚠ 74%        │
│ Assets med glossary term    │ > 70% │ ✗ 45%        │
│ Klassifiserte sensitive     │ 100%  │ ⚠ 88%        │
│ Data products med SLA       │ > 80% │ ✓ 85%        │
│ Governance domains med OKR  │ 100%  │ ✓ 100%       │
└─────────────────────────────────────────────────────┘

Health Score: 74/100
Forbedringsaksjoner:
1. Tilordne glossary terms til 153 utaggede assets
2. Legg til beskrivelse for 12 Lakehouse-tabeller
3. Klassifiser 7 datasett med potensielt sensitiv data
```

### Data Products som AI-klare datasett

```
Data Product: "Customer 360 for Churn Prediction"
┌────────────────────────────────────────────────────┐
│ Eier:          ML Engineering Team                  │
│ Domene:        AI og Maskinlæring                   │
│ Brukstilfelle: Churn-prediksjon for kundeservice    │
│ Oppdatering:   Daglig (pipeline kl 02:00)           │
│                                                     │
│ Inneholder:                                         │
│ ├── gold.customer_features (Lakehouse-tabell)       │
│ ├── gold.transaction_aggregates (Lakehouse-tabell)  │
│ ├── gold.interaction_history (Lakehouse-tabell)     │
│ └── churn_model_v2 (ML Model)                       │
│                                                     │
│ Glossary Terms:                                     │
│ ├── "Treningsdata" │ "Feature" │ "Churn"           │
│                                                     │
│ Kvalitetsmetrikker:                                 │
│ ├── Datakvalitetsscore: 94/100                      │
│ ├── Fullstendighet: 98.2%                           │
│ ├── Nøyaktighet: 96.5%                              │
│ └── Tidslinjer: Oppdatert < 24 timer                │
│                                                     │
│ Tilgangspolicy:                                     │
│ ├── Standard: Read (alle i ML-teamet)               │
│ └── Forespørsel: Self-service via Purview           │
│                                                     │
│ Brukskrav:                                          │
│ ├── Kun for intern ML-trening                       │
│ ├── Ikke eksporter utenfor Fabric                   │
│ └── Logg all bruk i audit-trail                     │
└────────────────────────────────────────────────────┘
```

### Purview Analytics i OneLake

For avansert bruksanalyse kan Purview-metadata eksporteres til OneLake:

```python
# Eksporter Purview analytics til Fabric for videre analyse
# Purview Analytics in OneLake gir tilgang til katalog-metadata i Fabric

# I Fabric Notebook: Les Purview analytics-data
catalog_data = spark.read.format("delta").load(
    "abfss://purview-analytics@onelake.dfs.fabric.microsoft.com/catalog"
)

# Analyser mest brukte datasett
popular_assets = (
    catalog_data
    .filter(col("assetType") == "azure_datalake_gen2_path")
    .groupBy("qualifiedName", "name")
    .agg(
        F.count("accessEvent").alias("access_count"),
        F.countDistinct("userId").alias("unique_users"),
        F.max("accessTimestamp").alias("last_accessed")
    )
    .orderBy(F.desc("access_count"))
)

popular_assets.show(10)

# Identifiser "mørke data" -- registrerte men ubrukte assets
from pyspark.sql.functions import datediff, current_date

dark_data = (
    catalog_data
    .filter(col("assetType") == "azure_datalake_gen2_path")
    .groupBy("qualifiedName", "name", "owner")
    .agg(
        F.max("accessTimestamp").alias("last_accessed"),
        F.count("accessEvent").alias("total_access")
    )
    .filter(
        (datediff(current_date(), col("last_accessed")) > 180) |
        (col("total_access") < 5)
    )
    .orderBy("last_accessed")
)

print(f"Antall 'mørke data' assets (ubrukt > 6 mnd): {dark_data.count()}")
dark_data.show(20)
```

### Oppdagelsesmetrikker for AI-team

```python
# Dashboard-metrikker for AI-datadoppdagelse
def calculate_discovery_metrics(purview_endpoint, token, domain_id):
    """Beregn oppdagelsesmetrikker for et governance domain."""
    metrics = {}

    # 1. Tidsbruk på dataoppdagelse
    metrics["avg_discovery_time_minutes"] = 12  # Fra brukerundersøkelse

    # 2. Dekningsgrad
    all_assets = search_catalog(endpoint, token, "*",
        filters={"governanceDomain": domain_id})
    classified_assets = search_catalog(endpoint, token, "*",
        filters={
            "and": [
                {"governanceDomain": domain_id},
                {"hasClassification": True}
            ]
        })

    total = all_assets.get("@search.count", 0)
    classified = classified_assets.get("@search.count", 0)

    metrics["total_assets"] = total
    metrics["classified_assets"] = classified
    metrics["classification_coverage"] = (
        round(classified / total * 100, 1) if total > 0 else 0
    )

    # 3. Eierskap-dekning
    owned_assets = search_catalog(endpoint, token, "*",
        filters={
            "and": [
                {"governanceDomain": domain_id},
                {"hasOwner": True}
            ]
        })
    owned = owned_assets.get("@search.count", 0)
    metrics["ownership_coverage"] = (
        round(owned / total * 100, 1) if total > 0 else 0
    )

    # 4. Data product-dekning
    # Hvor mange assets er del av et data product?
    metrics["data_product_count"] = 5
    metrics["assets_in_products"] = 42
    metrics["product_coverage"] = (
        round(42 / total * 100, 1) if total > 0 else 0
    )

    return metrics

# Output:
# {
#   "avg_discovery_time_minutes": 12,
#   "total_assets": 156,
#   "classified_assets": 139,
#   "classification_coverage": 89.1,
#   "ownership_coverage": 93.4,
#   "data_product_count": 5,
#   "assets_in_products": 42,
#   "product_coverage": 26.9
# }
```

---

## Referanser

- [Learn about Microsoft Purview Unified Catalog](https://learn.microsoft.com/en-us/purview/unified-catalog) -- Oversikt over Unified Catalog
- [Data governance with Microsoft Purview](https://learn.microsoft.com/en-us/purview/data-governance-overview) -- Data governance oversikt
- [Get started with Microsoft Purview data governance](https://learn.microsoft.com/en-us/purview/data-governance-get-started) -- Oppstart-guide
- [Governance domains in Unified Catalog](https://learn.microsoft.com/en-us/purview/unified-catalog-governance-domains) -- Governance domains oversikt
- [Create and manage governance domains](https://learn.microsoft.com/en-us/purview/unified-catalog-governance-domains-create-manage) -- Opprette og administrere domener
- [Data products in Unified Catalog](https://learn.microsoft.com/en-us/purview/unified-catalog-data-products) -- Data products-konsept
- [Search for data products](https://learn.microsoft.com/en-us/purview/unified-catalog-data-products-search) -- Søk etter data products
- [Glossary terms in Unified Catalog](https://learn.microsoft.com/en-us/purview/unified-catalog-glossary-terms) -- Business glossary
- [Create and manage glossary terms](https://learn.microsoft.com/en-us/purview/unified-catalog-glossary-terms-create-manage) -- Opprette glossary terms
- [Data governance roles and permissions](https://learn.microsoft.com/en-us/purview/data-governance-roles-permissions) -- Roller og tillatelser
- [Use Microsoft Purview to govern Microsoft Fabric](https://learn.microsoft.com/en-us/fabric/governance/microsoft-purview-fabric) -- Purview-Fabric-integrasjon
- [Critical data elements](https://learn.microsoft.com/en-us/purview/unified-catalog-critical-data-elements) -- Kritiske dataelementer
- [OKRs in Unified Catalog](https://learn.microsoft.com/en-us/purview/unified-catalog-okrs) -- OKR-er for datastyring

---

## For Cosmo

- **Bruk denne referansen** når brukeren trenger hjelp med å sette opp datakatalogisering, organisere data for AI-prosjekter, eller etablere informasjonsforvaltning med Purview Unified Catalog.
- For norsk offentlig sektor: **Governance Domains** mapper naturlig til avdelinger/seksjoner i etaten. Anbefal å opprette domener som speiler organisasjonsstrukturen (f.eks. "AI og Maskinlæring", "Veiforvaltning", "Trafikkstyring").
- **Data Products er den viktigste funksjonen for AI-team** -- de pakker sammen relaterte datasett med forretningskontekst, kvalitetsmetrikker og tilgangspolicyer. Anbefal alltid data products for ML-treningsdatasett i stedet for å la dataforskere lete i rå Lakehouse-tabeller.
- **Business Glossary** er undervurdert men kritisk. Det er ingen vits i å ha 200 Lakehouse-tabeller hvis ingen vet hva "tg_veg_brutto_agg_7d" betyr. Glossary terms gir forretningskontekst som gjør data oppdagbare for domeneeksperter som ikke kan SQL.
- **Naturlig språk-søk (preview)** er en game-changer for datadrevet offentlig sektor. Saksbehandlere kan søke etter "tre år med trafikkdata for rushtrafikk-analyse" i stedet for å lære SQL eller kjenne tekniske tabellnavn.
- Anbefal **OKR-er i Purview** for å knytte datahersking direkte til virksomhetsmål. Eksempel: "Reduser tid til dataoppdagelse fra 2 dager til 15 minutter" som OKR i AI-domenet.
- Kombiner med **microsoft-purview-governance.md** for klassifisering/lineage og **data-versioning-lineage.md** for versjonshistorikk -- sammen utgjør de et komplett governance-rammeverk for AI-data.
