Dataset Updates

Bestaande Datasets Bijwerken

Werk bestaande datasets bij met nieuwe gegevens uit CSV-bestanden, ZIP-pakketten of binaire bestanden. Updates behouden de dataset-ID en bijbehorende configuraties.

Dataset Bijwerken vanaf CSV

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/csv

Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een CSV-bestand. Het systeem detecteert automatisch de kolomtoewijzingen uit de datasetconfiguratie.

Padparameters

Parameter Type Verplicht Beschrijving
tenantId GUID Ja De tenant-identificatie
projectId GUID Ja De projectidentificatie
datasetId GUID Ja De dataset-identificatie die bijgewerkt moet worden

Request (multipart/form-data)

Veld Type Verplicht Beschrijving
file file Ja CSV-bestand met nieuwe gegevens (max 1GB)
cultureInfo string Nee Cultuur voor parsing (standaard: "en-US")

Response (200 OK)

{
  "datasetId": "550e8400-e29b-41d4-a716-446655440000",
  "caseCount": 5500,
  "eventCount": 165000,
  "invalidValueCount": 0,
  "skippedRowsCount": 0,
  "errors": [],
  "rowIssues": [],
  "statusCode": 200
}

Foutresponses

Bad Request (400):

dataset with id '{datasetId}' not found
can't update '{datasetName}' because it's not an original dataset

Dataset Bijwerken vanaf ZIP-pakket

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/package

Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een ZIP-pakket.

Request (multipart/form-data)

Veld Type Verplicht Beschrijving
file file Ja ZIP-pakketbestand met nieuwe data (max 1GB)
cultureInfo string Nee Cultuur voor parsing (standaard: "en-US")

Response (200 OK)

Zelfde structuur als CSV-update response.

Foutresponse (422 Unprocessable Entity)

{
  "errors": ["Invalid package structure"],
  "rowIssues": [
    {
      "rowIndex": 15,
      "columnName": "Timestamp",
      "errorType": "ParseError",
      "outcome": "Skipped",
      "message": "Unable to parse date value"
    }
  ],
  "statusCode": 422
}

Dataset Bijwerken vanaf Binary

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/binary

Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een binaire bestand.

Request (multipart/form-data)

Veld Type Verplicht Beschrijving
file file Ja Binair bestand met nieuwe gegevens (max 1GB)

Response (200 OK)

Zelfde structuur als CSV-update response.

Update Beperkingen

  • Alleen Originele Datasets: Alleen originele datasets kunnen worden bijgewerkt. Datasets die zijn afgeleid van filters of andere transformaties kunnen niet direct worden bijgewerkt.
  • Configuratie Behouden: Updates behouden de dataset-ID en alle bijbehorende configuraties (notebooks, blokken, enz.)
  • Kolomconsistentie: De nieuwe data moet dezelfde kolomstructuur hebben als de originele dataset

Implementatie Voorbeelden

cURL - Update vanuit CSV

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/csv" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_event_log.csv" \
  -F "cultureInfo=en-US"

cURL - Update vanuit ZIP-pakket

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/package" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_data_package.zip" \
  -F "cultureInfo=en-US"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
PROJECT_ID = '87654321-4321-4321-4321-210987654321'
BASE_URL = 'https://your-mindzie-instance.com'

class DatasetUpdater:
    def __init__(self, token):
        self.headers = {'Authorization': f'Bearer {token}'}

    def update_from_csv(self, dataset_id, file_path, culture='en-US'):
        """Update dataset from CSV file."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/csv'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'text/csv')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Update failed: {response.text}')

    def update_from_package(self, dataset_id, file_path, culture='en-US'):
        """Update dataset from ZIP package."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/package'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/zip')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        elif response.status_code == 422:
            result = response.json()
            print(f"Validation errors: {result['errors']}")
            for issue in result.get('rowIssues', []):
                print(f"  Row {issue['rowIndex']}: {issue['message']}")
            raise Exception('Data validation failed')
        else:
            raise Exception(f'Update failed: {response.text}')

    def update_from_binary(self, dataset_id, file_path):
        """Update dataset from binary file."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/binary'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/octet-stream')}

            response = requests.put(url, headers=self.headers, files=files)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Update failed: {response.text}')

# Gebruik
updater = DatasetUpdater('your-auth-token')

# Update vanuit CSV
result = updater.update_from_csv(
    '550e8400-e29b-41d4-a716-446655440000',
    'updated_event_log.csv'
)
print(f"Bijgewerkte dataset: {result['datasetId']}")
print(f"Nieuw aantal cases: {result['caseCount']}")
print(f"Nieuw aantal events: {result['eventCount']}")

# Controleer op problemen
if result['skippedRowsCount'] > 0:
    print(f"Waarschuwing: {result['skippedRowsCount']} rijen zijn overgeslagen")
if result['invalidValueCount'] > 0:
    print(f"Waarschuwing: {result['invalidValueCount']} ongeldige waarden gevonden")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const PROJECT_ID = '87654321-4321-4321-4321-210987654321';
const BASE_URL = 'https://your-mindzie-instance.com';

class DatasetUpdater {
  constructor(token) {
    this.token = token;
  }

  async updateFromCsv(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/csv`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else if (response.status === 422) {
      const result = await response.json();
      throw new Error(`Validatie mislukt: ${result.errors.join(', ')}`);
    } else {
      throw new Error(`Update mislukt: ${await response.text()}`);
    }
  }

  async updateFromPackage(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/package`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else {
      const error = await response.json();
      throw new Error(`Update mislukt: ${error.errors?.join(', ') || response.statusText}`);
    }
  }
}

// Gebruik (browser)
const updater = new DatasetUpdater('your-auth-token');
const fileInput = document.getElementById('updateFile');

fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];
  const datasetId = '550e8400-e29b-41d4-a716-446655440000';

  try {
    const result = await updater.updateFromCsv(datasetId, file);

    console.log(`Bijgewerkt: ${result.datasetId}`);
    console.log(`Nieuwe cases: ${result.caseCount}`);
    console.log(`Nieuwe events: ${result.eventCount}`);

    if (result.skippedRowsCount > 0) {
      console.warn(`Overslagen ${result.skippedRowsCount} rijen`);
    }
  } catch (error) {
    console.error('Update mislukt:', error.message);
  }
});

Response Velden

Veld Type Beschrijving
datasetId GUID ID van de bijgewerkte dataset
caseCount integer Aantal unieke cases in de bijgewerkte gegevens
eventCount integer Totaal aantal events in de bijgewerkte gegevens
invalidValueCount integer Aantal aangetroffen ongeldige waarden
skippedRowsCount integer Aantal rijen overgeslagen vanwege fouten
errors array Lijst met foutmeldingen
rowIssues array Gedetailleerde informatie over problemen op rij-niveau
statusCode integer HTTP-statuscode

Structuur van Rij-issue

{
  "rowIndex": 15,
  "columnName": "Timestamp",
  "errorType": "ParseError",
  "outcome": "Skipped",
  "message": "Unable to parse date value '2024-13-45'"
}
Veld Beschrijving
rowIndex Rij-nummer met het probleem
columnName Kolom met de probleemwaarde
errorType Type fout (ParseError, ValidationError, enz.)
outcome Wat er gebeurde (Skipped, DefaultValue, enz.)
message Menselijk leesbare foutbeschrijving

Best Practices

  • Maak Eerst Backup: Overweeg om de huidige data te exporteren voor updates
  • Verifieer Structuur: Zorg dat de nieuwe data dezelfde kolomstructuur heeft
  • Controleer Resultaten: Bekijk rowIssues en skippedRowsCount na updates
  • Test Eerst: Test updates eerst op een niet-productiedataset
  • Culture-instellingen: Gebruik de correcte cultuur voor datum- en getalformaten