Skip to content

/operations/indicateur/{id} #452

@ChristopheYon

Description

@ChristopheYon

Ajout d'un endpoint renvoyant la description d'un indicateur (y compris le lien vers son rapport qualité)

Edit : ajout d'une proposition de requête et de réponse json

# Requête Magma-fusion pour le service /operations/indicateur/{id}

SELECT ?indicatorId  ?indicator 
?indicatorLabelLg1 ?indicatorLabelLg2 ?indicatorAltLabelLg1 ?indicatorAltLabelLg2 
?indicatorAbstractLg1 ?indicatorAbstractLg2 ?indicatorHistoryNoteLg1 ?indicatorHistoryNoteLg2 
?periodicity ?periodicityId ?periodicityLabelLg1 ?periodicityLabelLg2 
?wasGeneratedBySeries
?seeAlsoSeries ?seeAlsoIndicators
?sims ?simsId 
?created ?modified 
?creators ?publishers ?contributors
?validationState
WHERE {
	BIND('${indicatorId}' AS ?indicatorId)
	# NB: pour l'instant, les variables de langue ne sont pas reportées dans les sous-requêtes
	BIND('${LG1}' AS ?lg1)
	BIND('${LG2}' AS ?lg2)
	
	# Un indicateur est un StatisticalIndicator
	?indicator a insee:StatisticalIndicator .
	FILTER(STRAFTER(STR(?indicator),'/produits/indicateur/') = ?indicatorId ) .
	
	#Infos sur l'indicateur lui-même (tout en OPTIONAL pour éviter les problèmes)
	#Labels
	OPTIONAL {?indicator skos:prefLabel ?indicatorLabelLg1 . FILTER (lang(?indicatorLabelLg1) = ?lg1)}
	OPTIONAL {?indicator skos:prefLabel ?indicatorLabelLg2 . FILTER (lang(?indicatorLabelLg2) = ?lg2)}
	#Alt labels
	OPTIONAL {?indicator skos:altLabel ?indicatorAltLabelLg1 . FILTER (lang(?indicatorAltLabelLg1) = ?lg1)}
	OPTIONAL {?indicator skos:altLabel ?indicatorAltLabelLg2 . FILTER (lang(?indicatorAltLabelLg2) = ?lg2)}
	#Abstract
	OPTIONAL {?indicator dcterms:abstract ?indicatorAbstractLg1 . FILTER (lang(?indicatorAbstractLg1) = ?lg1)}
	OPTIONAL {?indicator dcterms:abstract ?indicatorAbstractLg2 . FILTER (lang(?indicatorAbstractLg2) = ?lg2)}
	#HistoryNote
	OPTIONAL {?indicator skos:historyNote ?indicatorHistoryNoteLg1 . FILTER (lang(?indicatorHistoryNoteLg1) = ?lg1)}
	OPTIONAL {?indicator skos:historyNote ?indicatorHistoryNoteLg2 . FILTER (lang(?indicatorHistoryNoteLg2) = ?lg2)}
	#Periodicity
	OPTIONAL { 
		?indicator dcterms:accrualPeriodicity ?periodicity . 
		OPTIONAL {?periodicity skos:notation ?periodicityId}
		OPTIONAL{?periodicity skos:prefLabel ?periodicityLabelLg1 . FILTER (lang(?periodicityLabelLg1) = ?lg1)}
		OPTIONAL{?periodicity skos:prefLabel ?periodicityLabelLg2 . FILTER (lang(?periodicityLabelLg2) = ?lg2)}
	}
	
	#Séries mères (il peut y en avoir plusieurs)
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(STR(?wasGeneratedBySerieId), '$', STR(?wasGeneratedBySerie), '$', COALESCE(?wasGeneratedBySerieLabelLg1, ''), '$', COALESCE(?wasGeneratedBySerieLabelLg2, '')) ; SEPARATOR='|') AS ?wasGeneratedBySeries)
		WHERE {
			?wasGeneratedBySerie a insee:StatisticalOperationSeries ; (^prov:wasGeneratedBy) ?indicator .
			BIND(STRAFTER(STR(?wasGeneratedBySerie),'/operations/serie/') AS ?wasGeneratedBySerieId ) .
			OPTIONAL {?wasGeneratedBySerie skos:prefLabel ?wasGeneratedBySerieLabelLg1 . FILTER (lang(?wasGeneratedBySerieLabelLg1) = '${LG1}')}
			OPTIONAL {?wasGeneratedBySerie skos:prefLabel ?wasGeneratedBySerieLabelLg2 . FILTER (lang(?wasGeneratedBySerieLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	
	# Autres objets liés à l'indicateur
	#Séries voir aussi
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(STR(?seeAlsoSerieId), '$', STR(?seeAlsoSerie), '$', COALESCE(?seeAlsoSerieLabelLg1, ''), '$', COALESCE(?seeAlsoSerieLabelLg2, '')) ; SEPARATOR='|') AS ?seeAlsoSeries)
		WHERE {
			?seeAlsoSerie a insee:StatisticalOperationSeries ; (^rdfs:seeAlso|rdfs:seeAlso) ?indicator .
			BIND(STRAFTER(STR(?seeAlsoSerie),'/operations/serie/') AS ?seeAlsoSerieId ) .
			OPTIONAL {?seeAlsoSerie skos:prefLabel ?seeAlsoSerieLabelLg1 . FILTER (lang(?seeAlsoSerieLabelLg1) = '${LG1}')}
			OPTIONAL {?seeAlsoSerie skos:prefLabel ?seeAlsoSerieLabelLg2 . FILTER (lang(?seeAlsoSerieLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	#Indicateurs voir aussi
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(STR(?seeAlsoIndicatorId), '$', STR(?seeAlsoIndicator), '$', COALESCE(?seeAlsoIndicatorLabelLg1, ''), '$', COALESCE(?seeAlsoIndicatorLabelLg2, '')) ; SEPARATOR='|') AS ?seeAlsoIndicators)
		WHERE {
			?seeAlsoIndicator a insee:StatisticalIndicator ; (^rdfs:seeAlso|rdfs:seeAlso) ?indicator .
			BIND(STRAFTER(STR(?seeAlsoIndicator),'/produits/indicateur/') AS ?seeAlsoIndicatorId ) .
			OPTIONAL {?seeAlsoIndicator skos:prefLabel ?seeAlsoIndicatorLabelLg1 . FILTER (lang(?seeAlsoIndicatorLabelLg1) = '${LG1}')}
			OPTIONAL {?seeAlsoIndicator skos:prefLabel ?seeAlsoIndicatorLabelLg2 . FILTER (lang(?seeAlsoIndicatorLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	#Sims
	OPTIONAL {
		?sims a sdmx-mm:MetadataReport; sdmx-mm:target ?indicator .
		BIND(STRAFTER(STR(?sims),'/qualite/rapport/') AS ?simsId)
	}
	
	# Informations de gestion
	# Dates
	OPTIONAL {?indicator dcterms:created ?created}
	OPTIONAL {?indicator dcterms:modified ?modified}
	
	# Agents
	# Creator
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(COALESCE(?creatorId, ''), '$', STR(?creator), '$', COALESCE(?creatorLabelLg1, ''), '$', COALESCE(?creatorLabelLg2, '')) ; SEPARATOR='|') AS ?creators)
		WHERE {
			?creator a org:Organization ; ^dc:creator ?indicator .
			OPTIONAL{?creator dct:identifier ?creatorId}
			OPTIONAL {?creator skos:prefLabel ?creatorLabelLg1 . FILTER (lang(?creatorLabelLg1) = '${LG1}')}
			OPTIONAL {?creator skos:prefLabel ?creatorLabelLg2 . FILTER (lang(?creatorLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	# Publisher
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(COALESCE(?publisherId, ''), '$', STR(?publisher), '$', COALESCE(?publisherLabelLg1, ''), '$', COALESCE(?publisherLabelLg2, '')) ; SEPARATOR='|') AS ?publishers)
		WHERE {
			?publisher a org:Organization ; ^dcterms:publisher ?indicator .
			OPTIONAL{?publisher dct:identifier ?publisherId}
			OPTIONAL {?publisher skos:prefLabel ?publisherLabelLg1 . FILTER (lang(?publisherLabelLg1) = '${LG1}')}
			OPTIONAL {?publisher skos:prefLabel ?publisherLabelLg2 . FILTER (lang(?publisherLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	# Contributor
	OPTIONAL {
		SELECT ?indicator (GROUP_CONCAT(DISTINCT CONCAT(COALESCE(?contributorId, ''), '$', STR(?contributor), '$', COALESCE(?contributorLabelLg1, ''), '$', COALESCE(?contributorLabelLg2, '')) ; SEPARATOR='|') AS ?contributors)
		WHERE {
			?contributor a org:Organization ; ^dcterms:contributor ?indicator .
			OPTIONAL{?contributor dct:identifier ?contributorId}
			OPTIONAL {?contributor skos:prefLabel ?contributorLabelLg1 . FILTER (lang(?contributorLabelLg1) = '${LG1}')}
			OPTIONAL {?contributor skos:prefLabel ?contributorLabelLg2 . FILTER (lang(?contributorLabelLg2) = '${LG2}')}
		}
		GROUP BY ?indicator
	}
	
	# Statut
	OPTIONAL {?indicator insee:validationState ?validationState}
}

Qui donnerait comme résultat :

{
  "id": "?indicatorId",
  "uri": "?indicator",
  "label": [
    {
      "contenu": ".indicatorLabelLg1",
      "langue": "?lg1"
    },
    {
      "contenu": "?indicatorLabelLg2",
      "langue": "?lg2"
    }
  ],
  "altLabel": [
    {
      "contenu": "?indicatorAltLabelLg1",
      "langue": "?lg1"
    },
    {
      "contenu": "?indicatorAltLabelLg2",
      "langue": "?lg2"
    }
  ],
  "resume": [
    {
      "contenu": "?indicatorAbstractLg1",
      "langue": "?lg1"
    },
    {
      "contenu": "?indicatorAbstractLg2",
      "langue": "?lg2"
    }
  ],
  "noteHistorique": [
    {
      "contenu": "?indicatorHistoryNoteLg1",
      "langue": "?lg1"
    },
    {
      "contenu": "?indicatorHistoryNoteLg2",
      "langue": "?lg2"
    }
  ],
  "frequenceCollecte": {
    "id": "?periodicityId",
    "uri": "?periodicity",
    "label": [
      {
        "contenu": "?periodicityLabelLg1",
        "langue": "?lg1"
      },
      {
        "contenu": "?periodicityLabelLg2",
        "langue": "?lg2"
      }
    ]
  },
  "rapportQualite": {
    "id": "?simsId",
    "uri": "?sims"
  },
  "seriesContributrices": [
    {
      "id": "wasGeneratedBySeries[1]",
      "uri": "wasGeneratedBySeries[2]",
      "label": [
        {
          "contenu": "wasGeneratedBySeries[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "wasGeneratedBySeries[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "seriesLiees": [
    {
      "id": "?seeAlsoSeries[1]",
      "uri": "?seeAlsoSeries[2]", 
      "label": [
        {
          "contenu": "?seeAlsoSeriesseeAlsoSeries[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "?seeAlsoSeries[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "indicateursLies": [
    {
      "id": "?indicators[1]",
      "uri": "?indicators[2]", 
      "label": [
        {
          "contenu": "?indicators[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "?indicators[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "dateCreation": "?created", 
  "dateMiseAJour": "?modified",
  "proprietaires": [
    {
      "id": "?creators[1]",
      "uri": "?creators[2]",
      "label": [
        {
          "contenu": "?creators[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "?creators[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "organismesResponsables": [
    {
      "id": "?publishers[1]",
      "uri": "?publishers[2]",
      "label": [
        {
          "contenu": "?publishers[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "?publishers[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "partenaires": [
    {
      "id": "?contributors[1]",
      "uri": "?contributors[2]",
      "label": [
        {
          "contenu": "?contributors[3]",
          "langue": "?lg1"
        },
        {
          "contenu": "?contributors[4]",
          "langue": "?lg2"
        }
      ]
    }
  ],
  "statutValidation": "?validationState"
}

Même remarque que dans la carte pour /operations/serie/{id} : les ressources multiples sont regroupées dans des sous-requêtes avec des GROUP BY dans la requête proposée, ce qui nécessite des doubles split de chaîne de caractère en Java. Le choix fait pour /operations/serie/{id} s'appliquera de la même manière ici.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions