Matcha LegacyAmsTaxonomyId med SSYK-2012?

Hej!

Jag vill alltså översätta “AMS_taxonomy” (som är den gamla taxonomin, det ni kallar legacy, om jag förstått det rätt) till SSYK-2012 koder. Det handlar om ca 3400 yrken och är, enligt den information jag har fått, den taxonomi som används i platsbanken än idag. På denna gitlab har ni en “sub-heading” som lyder " Convert between Old and New Taxonomy ids". Tyvärr fungerade inte de URL som hänvisas där.

Testade följande MyQuery

concepts(include_deprecated: true, type: "occupation-name") {
    id
    preferred_label
    type
    deprecated_legacy_id
    deprecated
    ssyk_code_2012
  }
}

Dock verkar översättningarna inte finnas där. Det jag får ut är “null” överallt:

        "ssyk_code_2012": null

Här är min egna Python kod där jag försöker uppnå samma sak. Lyckades få fram 547 “matchade” data-punkter. Vill helst inte gå igenom de resterande 2900 yrkena manuellt…

response = requests.get("https://taxonomy.api.jobtechdev.se/v1/taxonomy/specific/concepts/ssyk?include-legacy-information=true&type=ssyk-level-3%20ssyk-level-4")
                        
def jprint(obj):
    # create a formatted string of the Python JSON object
    text = json.dumps(obj, sort_keys=True, indent=4)
    print(text)

listlen = len(response.json())

for i in range(0,listlen):
    print(response.json()[i]["taxonomy/ssyk-code-2012"],";",response.json()[i]["taxonomy/preferred-label"],";",response.json()[i]["taxonomy/deprecated-legacy-id"])
1 gillning

Hej Simon!

Bra fråga! Jag tolkar det som att du vill ha ett sådant här format du är ute efter:

 "ssyk-code-2012 ; preferred-label ; deprecated-legacy-id".

Det lite luriga är att ssyk-code-2012-attributet ligger på själva SSYK-grupperna, dvs en nivå uppåt i hierarkin, därför ges null om man försöker hitta det på occupation-name concept. Så man får försöka härleda ssyk-koden genom att kolla på vilket ssyk-level-4 concept som occupation-name conceptet är kopplat till.

Jag tror att det enklaste är att göra en graphql-query som utgår från occupation-name (och version 1 om det är gamla taxonomin som är intressant) och som hämtar relaterade ssyk-level-4 concept.

Exempelvis något i stil med:

endpoint = "https://taxonomy.api.jobtechdev.se/v1/taxonomy/graphql?query="

graphql_query = """query MyQuery {
  concepts(type: "occupation-name", version: "1") {
    id
    preferred_label
    deprecated_legacy_id
    broader(type: "ssyk-level-4") {
      id
      ssyk_code_2012
    }
  }
}
"""

    response = requests.get(endpoint + graphql_query).json()["data"]["concepts"]

    for i in range(0, len(response)):
        print(response[i]["broader"][0]["ssyk_code_2012"], ";", response[i]["preferred_label"], ";",
              response[i]["deprecated_legacy_id"])

Ger följande:

2651 ; Skulptör ; 6047
2653 ; Dansare ; 6050
2655 ; Skådespelare ; 6051

Jag får ursäkta min inte så vackra kod men du förstår säkert tanken :slight_smile:

Tack så mycket! Det var exakt det jag behövde! Koden fungerade utmärkt.

Jag har inte tidigare jobbat med API:er och har nog inte riktigt fått pli på det här med nivåerna.

Tänkte kolla att jag har förstått saker rätt

  1. “endpoint” är adressen/platsen vi hämtar vår information från (vilken plats skickar vi vår efterfrågan om att få information)? Så ni på JobTech har satt upp en server med GraphQL språket och den har en viss adress helt enkelt.
graphql_query = """ query MyQuery {
  concepts(type: "occupation-name", version: "1") 
#vi vill ha information från 'concepts', 
#och lägger in argument för type samt version, dvs vi avgränsar oss till dessa två {
    id 
    preferred_label
    deprecated_legacy_id  #vi vill ha ut id, preferred_label samt deprecated_legacy_id för information av typen 'occupation-name' version 1
broader(type: "ssyk-level-4") #här säger vi att vi också vill ha information 'ett steg upp' i hierarkin {
      id
      ssyk_code_2012
    }
"""

Därefter använder man samma standardformat för requests. graphql_query läggs till på endpoint eftersom det förra specificerar exakt vad det är för information vi vill ha ut.

  1. Varför måste vi lägga till [“data”] samt [“concepts”] efter json()? Gissar att det är (ungefär som?) dictionary “keys”.

  2. Fråga om narrower/broader. När man ber om information kan man börja “högre upp” och därefter specificera “narrower” följt av en mer snäv kategori (tex kan man börja med alla chefer, och sedan specificera mha “narrower” att man vill titta på chefer inom restaurang)? Alternativt kan man börja med en mer snäv kategori (tex SSYK2012) och därefter specificera “broader” för att få dennes “parent”?

Hej igen!

  1. Ja det stämmer mycket bra. Jag tycker det känns enklast att gå in i graphiql-gränssnittet för att definiera frågorna och sedan kopiera över dem, för att man direkt kan se vad man får ut för data.

Graphql är helt enkelt lite trevligare mot användaren och tillåter mer flexibilitet än swagger-gränssnittet.

  1. Precis, vi behöver dem för att svaret vi får från graphql börjar såhär:
{
  "data": {
    "concepts": [

Så vi vill helt enkelt navigera oss nedåt i strukturen med hjälp av “data” och “concepts” för att komma till listan med dicts. Ett annat sätt att göra det skulle kunna vara:


response = requests.get(endpoint + graphql_query).json()

x = response.get("data").get("concepts")

Obs dock att jag verkligen inte är kunnig på det här området och det finns säkert bättre sätt att göra det på.

  1. Precis! De har ett omvänt förhållande till varandra, så narrower från concept a till concept b innebär broader från concept b till concept a. Den här sortens struktur är exempelvis rätt vanlig:
query MyQuery {
  concepts(type: "occupation-field") {
    id
    preferred_label
    type
    narrower(type: "ssyk-level-4") {
      id
      preferred_label
      type
      ssyk_code_2012
      narrower {
        id
        preferred_label
        type
      }
    }
  }
}

Mvh
David