ഗ്രാഫ്ക്യുഎൽ
ഗ്രാഫ്ക്യുഎൽ ഒരു ഡാറ്റാ ക്വറിയായും മാനിപ്പുലേഷൻ ഭാഷയുമായാണ് പ്രവർത്തിക്കുന്നത്, ഇത് ഉപയോക്താക്കൾ ആവശ്യപ്പെടുന്ന ഡാറ്റയെ വ്യക്തമാക്കാൻ സഹായിക്കുന്നു. "ഡിക്ലറേറ്റീവ് ഡാറ്റ ഫെച്ചിംഗ്" എന്ന് പറഞ്ഞാൽ, ആവശ്യമായ ഡാറ്റ എവിടെ നിന്നാണ് നേടേണ്ടത് അല്ലെങ്കിൽ എങ്ങനെ അത് മാറ്റണമെന്ന് നമ്മൾക്ക് നിർവചിക്കാം. ഇത് റെസ്റ്റ് എപിഐ(REST API)കളെ താരതമ്യപ്പെടുത്തുമ്പോൾ, കൂടുതൽ സൗകര്യപ്രദമായ ഒരു രീതിയാണ്, കാരണം ഒരു സമയത്ത് തന്നെ ആവശ്യമായ എല്ലാ ഡാറ്റയും കിട്ടുന്നു. ഗ്രാഫ്ക്യുഎൽ എളുപ്പം പ്രയോഗിക്കാവുന്ന, സ്വാതന്ത്ര്യത്തോടെ ഡാറ്റ മാനിപ്പുലേറ്റ് ചെയ്യാനുള്ള കഴിവ് വലിയ ലക്ഷ്യങ്ങളുള്ള ആപ്ലിക്കേഷനുകൾക്ക് മികച്ച രീതിയിൽ ഉപയോഗപ്പെടുത്താൻ സാധിക്കുന്നു. ഒരു ഗ്രാഫ്ക്യുഎൽ സെർവർ, ക്ലയന്റ് ക്വറിയിൽ നിന്നുള്ള ഡാറ്റ പ്രോസസ് ചെയ്യുമ്പോൾ, വേർതിരിച്ചുള്ള സ്രോതസ്സുകളിൽ നിന്നുള്ള ഡാറ്റ ഉപയോഗിച്ച് ഫലങ്ങൾ സംയോജിപ്പിച്ച് ഒരു ഏകീകരിച്ച ഗ്രാഫ് രൂപത്തിൽ പ്രദാനം ചെയ്യുന്നു. ഇത് പറയുന്നത്, വിവിധ ഡാറ്റാ സ്രോതസ്സുകളിൽ നിന്നുള്ള വിവരങ്ങൾ (ഉദാഹരണത്തിന്, ഡാറ്റാബേസുകൾ, എപിഐകൾ, സെർവർ എന്നിവ) ഒരുമിച്ച് ഒരു എളുപ്പത്തിലുള്ള രൂപത്തിൽ ക്ലയന്റിന് നൽകാനാകും. ഗ്രാഫ്ക്യുഎൽ, ആവശ്യമായ ഡാറ്റ ഒരു സ്രോതസ്സിൽ നിന്ന് മാത്രമല്ല, പല സ്രോതസ്സുകളിൽ നിന്നുമുള്ള വിശദാംശങ്ങൾ കൂടി ഒരേസമയം സ്വീകരിക്കാൻ സാധിക്കുന്ന വിധത്തിൽ പ്രവർത്തിക്കുന്നു[2]. ഗ്രാഫ്ക്യുഎൽ എവിടെയും ഉപയോഗിക്കാം, പ്രത്യേകിച്ച് ഡാറ്റ സൂക്ഷിക്കുന്ന രീതികളുമായി ബന്ധപ്പെടുന്നില്ല. ഈ ഭാഷ ഉപയോഗിക്കാൻ നിരവധി സൗജന്യ ടൂളുകൾ (ഓപ്പൺ സോഴ്സ് എഞ്ചിനുകൾ) ഉണ്ട്. ഇത് ഡാറ്റ എളുപ്പത്തിൽ എടുക്കാനും മറ്റും സഹായിക്കുന്നു. ചരിത്രംഫേസ്ബുക്ക് 2012-ൽ ഗ്രാഫ്ക്യുഎൽ വികസപ്പിക്കുന്നത് ആരംഭിച്ചു, 2015-ൽ ഒരു ഡ്രാഫ്റ്റ് സപ്പോർട്ട് സ്പെസിഫിക്കേഷനും റഫറൻസ് ഇമ്പ്ലിമെന്റേഷനും ഓപ്പൺ സോഴ്സായി പുറത്തിറക്കി[3]. 2018-ൽ, ഗ്രാഫ്ക്യുവെൽ പുതിയതായി സ്ഥാപിച്ച ഗ്രാഫ്ക്യുഎൽ ഫൗണ്ടേഷനിലേക്ക് മാറ്റപ്പെട്ടു, അത് പിന്നീട് ലിനക്സ് ഫൗണ്ടേഷനിൽ ഹോസ്റ്റ് ചെയ്യപ്പെട്ടു[4][5]. 2018 ഫെബ്രുവരി 9-ന്, ഗ്രാഫ്ക്യുഎൽ സ്കീമാ ഡിഫിനിഷൻ ലാങ്വേജ് സ്പെസിഫിക്കേഷന്റെ ഭാഗമായി മാറി[6]. ഗ്രാഫ്ക്യുഎൽ (GraphQL) ഒരു ടെക്നോളജി ആണ്, ഇത് ഉപയോഗിച്ച് ആപ്പുകൾക്കുള്ള ഡാറ്റ കിട്ടാൻ എളുപ്പമാണ്. ഫേസ്ബുക്ക്, ഗിറ്റ്ഹബ്ബ്, ഗൂഗിൾ, യെൾപ്(Yelp), ഷോപ്പിഫൈ(Shopify) തുടങ്ങിയ വലിയ സൈറ്റുകൾ ഈ ടെക്നോളജി ഉപയോഗിക്കുന്നു. ഇത് ഡാറ്റ ആവശ്യത്തിന് അനുസരിച്ച്, കൂടുതൽ ശരിയായ രീതിയിൽ എടുക്കാനും ഉപയോഗിക്കാനും സഹായിക്കുന്നു[7]. ഡിസൈൻഗ്രാഫ്ക്യുഎൽ ഡാറ്റ വായിക്കുക, എഴുതുക (മ്യൂട്ടേറ്റ് ചെയ്യുക), കൂടാതെ ഡാറ്റയിലെ മാറ്റങ്ങൾ (റിയൽടൈം അപ്ഡേറ്റുകൾ – സാധാരണയായി വെബ്സോക്കറ്റുകൾ ഉപയോഗിച്ച്) കാണാനും സാധിക്കുന്നു. ഇത് ഉപയോക്താക്കൾക്ക് ഡാറ്റയിലെ എപ്പോഴും പുതിയ മാറ്റങ്ങൾ അറിയാനും, അത് എളുപ്പത്തിൽ പരിവർത്തനം ചെയ്യാനും സഹായിക്കുന്നു. ഗ്രാഫ്ക്യുഎൽ വഴി ആപ്ലിക്കേഷനുകൾക്ക് ഡാറ്റയുമായി പ്രവർത്തിക്കുന്നത് കൂടുതൽ ഫലപ്രദവും എളുപ്പവുമാണ്[8]. ഗ്രാഫ്ക്യുഎൽ സർവ്വീസ് സൃഷ്ടിക്കുന്നതിനായി, ആദ്യം ടൈപ്പുകളും ഫീൽഡുകളും നിർവചിച്ച്, ഓരോ ഫീൽഡിനും ഡാറ്റ കണ്ടെത്തുന്ന ഫംഗ്ഷനുകൾ നൽകുക എന്നതാണ്. ഈ ടൈപ്പുകളും ഫീൽഡുകളും ചേർന്നുള്ള ഘടനയെ സ്കീമ ഡിഫിനിഷൻ എന്നാണ് വിളിക്കുന്നത്. ഡാറ്റ കണ്ടെത്തി മാപ്പ് ചെയ്യുന്ന ഫംഗ്ഷനുകൾക്ക് റെസോൾവേഴ്സ് (Resolvers) എന്നാണ് പറയുന്നത്[9]. സ്കീമ തെറ്റില്ലാതെ കൃത്യമായി ഉണ്ടാക്കിയിട്ടുള്ളതാണെന്ന് സ്ഥിരീകരിച്ച ശേഷം, ഗ്രാഫ്ക്യുഎൽ ക്വറി റിക്വസ്റ്റ് സെർവറിൽ പ്രവർത്തിക്കുന്നു. ക്വറിയിൽ പറഞ്ഞിരിക്കുന്ന ആവശ്യങ്ങൾക്കു അനുസൃതമായ ഫലങ്ങൾ(result) ജെസൺ രൂപത്തിൽ ഒരു റെസ്പോൺസ് തിരികെ നൽകുന്നു[10]. ടൈപ്പ് സിസ്റ്റംഗ്രാഫ്ക്യുഎൽ സ്കീമിൽ, ക്വറി(Query) എന്നത് പ്രധാനപ്പെട്ടതാണ്. ഇത് സെർവറിൽ നിന്ന് വിവരങ്ങൾ ചോദിക്കാനായി ഉപയോഗിക്കുന്നു. മറ്റു ടൈപ്പുകൾ സെർവറുമായുള്ള വിശദമായ ഫീൽഡുകളും ഒബ്ജക്റ്റുകളും വെളിപ്പെടുത്തുന്നു. മറ്റു ടൈപ്പുകൾ ഗ്രാഫ്ക്യുഎൽ സെർവർ തിരിച്ചു നൽകാനാവുന്ന ഒബ്ജക്റ്റുകളും ഫീൽഡുകളും നിർവചിക്കുന്നു. സ്കാലർ അല്ലെങ്കിൽ അടിസ്ഥാന ടൈപ്പുകൾ സ്ട്രിംഗ്, നമ്പർ, ഐഡി തുടങ്ങിയ വസ്തുക്കളെ പ്രതിനിധാനം ചെയ്യുന്നു. ഫീൽഡുകൾ ഡീഫോൾട്ട് ആയി നള്ളബിൾ(nullable) ആയി നിർവചിച്ചിരിക്കുന്നു, എങ്കിൽ ഒരു ട്രെയിലിംഗ് എക്സ്ക്ലമേഷൻ മാർക്ക് (!) ഉപയോഗിച്ച് ഫീൽഡ് നോൺ-നള്ളബിൾ(non-nullable) ആക്കാം(നള്ളബിൾ (Nullable) എന്നത്, ഒരു ഫീൽഡിന് മൂല്യം ഉണ്ടാകണമെന്നുള്ള നിയമം ഇല്ലാതെയാണ് പ്രവർത്തിക്കുന്നത്. അതായത്, ആ ഫീൽഡ് ഒരു മൂല്യം (ഉദാ: സ്ട്രിംഗ്, നമ്പർ) സ്വീകരിക്കാൻ കഴിയും, എന്നാൽ അതിന് `null` (മൂല്യമില്ലാത്തത്) നൽകാൻ പറ്റും. ഇത് സാധാരണയായി അങ്ങനെ ഒരു മൂല്യം ലഭിക്കുന്നില്ലെങ്കിൽ അത് `null` ആകാം. ഉദാഹരണം: ``` name: String # ഇത് nullable ആയിരിക്കും, അതായത് name = null ആയി ``` നോൺ-നള്ളബിൾ (Non-nullable) എന്നത്, ആ ഫീൽഡിന് എപ്പോഴും ഒരു മൂല്യം ഉണ്ടാകണം. `null` ലഭിക്കാതിരിക്കാൻ വേണ്ടിയുള്ള ഉറപ്പാണ് ഇത്. എപ്പോഴും, അതിന് മൂല്യം നൽകിയിരിക്കണം. ഉദാഹരണം: ``` name: String! # ഇത് non-nullable ആണ്, അതിനാൽ `name` = null ആക്കാൻ പറ്റില്ല. ``` ഇവിടെ `!` ചിഹ്നം ഫീൽഡിന് നോൺ-നള്ളബിൾ ആണെന്ന് സൂചിപ്പിക്കുന്നു). ഫീൽഡ് ഒരു ലിസ്റ്റ് ആയി നിർവചിക്കാം, ഫീൽഡ് ടൈപ്പ് സ്ക്വയർ ബ്രാക്കറ്റിൽ ([]) ആക്കി നൽകുന്നു. ഉദാഹരണത്തിന്, `authors: [String]`.[11] type Query {
currentUser: User
}
type User {
id: ID!
name: String!
}
ക്വറീസ്ഗ്രാഫ്ക്യുഎൽ ക്വറി ക്ലയന്റിന് ആവശ്യമുള്ള ഡാറ്റയുടെ സൂക്ഷ്മ രൂപം നിർവ്വചിക്കുന്നു. ഇത്, ക്ലയന്റ് ആവശ്യപ്പെടുന്ന ഡാറ്റ മാത്രം തിരിച്ചു നൽകുന്നു, അതിനാൽ അധിക വേഗവും കാര്യക്ഷമതയും ലഭിക്കുന്നു. ഓരോ ഫീൽഡും വ്യക്തമായ രീതിയിൽ നിർവചിക്കപ്പെടുന്നതിനാൽ, ആവശ്യമായ വിവരങ്ങൾ മാത്രമേ ലഭ്യമാകൂ query CurrentUser {
currentUser {
name
age
}
}
ഗ്രാഫ്ക്യുഎൽ സർവറിൽ വെരിഫൈ ചെയ്തു എക്സിക്യൂട്ട് ചെയ്തതിന് ശേഷം, ഡാറ്റ അതേ രൂപത്തിൽ തിരിച്ചുപോരുന്നു. ഇത് ക്ലയന്റിന് ആവശ്യാമുള്ള ഡാറ്റ ശേഖരിക്കാൻ സഹായിക്കുന്നു. ഈ പ്രക്രിയ സുതാര്യതയും കാര്യക്ഷമതയും ഉറപ്പാക്കുന്നു. {
"currentUser": {
"name": "John Doe",
"age": 23
}
}
മ്യൂട്ടേഷൻസ്ഗ്രാഫ്ക്യുഎൽ മ്യൂട്ടേഷൻ ഡാറ്റ സൃഷ്ടിക്കാൻ, അപ്ഡേറ്റ് ചെയ്യാൻ, അല്ലെങ്കിൽ നീക്കം ചെയ്യാൻ അനുവദിക്കുന്നു(മ്യൂട്ടേഷൻ (Mutation) ഗ്രാഫ്ക്യുഎൽ (GraphQL) സിസ്റ്റത്തിൽ ഡാറ്റ സൃഷ്ടിക്കൽ, അപ്ഡേറ്റ് ചെയ്യൽ അല്ലെങ്കിൽ നീക്കം ചെയ്യലിനായി ഉപയോഗിക്കുന്ന ക്വറിയാണ്. മ്യൂട്ടേഷനുകൾ, ഡാറ്റ മാറ്റങ്ങൾ നിർവഹിക്കുന്നതിന് ക്ലയന്റിൽ നിന്നുള്ള ഇൻപുട്ട് വാല്യൂസ് (വേരിയബിളുകൾ) സ്വീകരിക്കുകയും, പ്രവർത്തനങ്ങൾ പൂർത്തിയാക്കിയതിന് ശേഷം പുതിയ ഡാറ്റ ക്വറി ചെയ്യുകയും ചെയ്യുന്നു. ഇത്, ഡാറ്റ എങ്ങനെയാണ് ഉപയോക്താവിന്റെ അടുത്തേക്ക് തിരിച്ചുപോകേണ്ടത് എന്നും നിർവചിക്കുന്നു). മ്യൂട്ടേഷനുകൾ സാധാരണയായി വേരിയബിളുകൾ ഉൾക്കൊള്ളുന്നു, ഇതിന്റെ സഹായത്തോടെ ക്ലയന്റിൽ നിന്നുള്ള ഡാറ്റ സെർവറിലേക്ക് അയക്കപ്പെടുന്നു. മ്യൂട്ടേഷൻ, ഓപ്പറേഷൻ പൂർത്തിയാക്കിയതിന് ശേഷം ക്ലയന്റിലേക്ക് തിരിച്ചുപോകുന്ന ഡാറ്റയുടെ രൂപം നിർവചിക്കുകയും ചെയ്യുന്നു. mutation CreateUser($name: String!, $age: Int!) {
createUser(userName: $name, age: $age) {
name
age
}
}
മ്യൂട്ടേഷനിൽ ഉള്ള വേരിയബിളുകൾ, വേരിയബിൾ നാമങ്ങൾക്കുള്ള ഫീൽഡുകൾ ഉള്ള ഒരു ഒബ്ജെക്ട് ആയി അയക്കപ്പെടുന്നു. ഇതിലൂടെ, ക്ലയന്റ് സെർവറിലേക്കുള്ള ഡാറ്റ പാസ്സായി, ആ ഡാറ്റ മ്യൂട്ടേഷനിൽ ആവശ്യമായ രീതിയിൽ പ്രോസസ് ചെയ്യപ്പെടുന്നു. വേരിയബിളുകളുടെ പേര് നൽകുന്ന ഫീൽഡുകൾ, മ്യൂട്ടേഷൻ പ്രക്രിയയിൽ ശരിയായ ഡാറ്റ ലഭ്യമാക്കാൻ സഹായിക്കുന്നു. {
"name": "Han Solo",
"age": 42
}
ഓപ്പറേഷൻ പൂർത്തിയാകുമ്പോൾ, ഗ്രാഫ്ക്യുഎൽ സെർവർ മ്യൂട്ടേഷനിൽ നിർവചിച്ച രൂപത്തിൽ ഡാറ്റ തിരിച്ചു നൽകും. ഇത്, ഉപയോക്താവിന്റെ ആവശ്യപ്രകാരം മാറ്റങ്ങൾ ചെയ്ത ശേഷം, ശരിയായ ഡാറ്റ പൂർണ്ണമായും ലഭ്യമാക്കുന്നു. മ്യൂട്ടേഷനിലെ നിർദ്ദേശങ്ങൾ അനുസരിച്ച് ഡാറ്റ എങ്ങനെ ഫോർമാറ്റ് ചെയ്യപ്പെടണം എന്ന് നിർവചിച്ചിരിക്കുന്നു. {
"data": {
"createUser": {
"name": "Han Solo",
"age": 42
}
}
}
സബ്സ്ക്രിപ്ഷനുകൾഗ്രാഫ്ക്യുഎല്ലിൽ സബ്ക്രിപ്ഷൻ(subscription) ഉപയോഗിച്ച് സെർവറിൽ എന്തെങ്കിലും മാറ്റം വന്നാൽ ക്ലൈന്റിന്(ഉപയോഗിക്കുന്ന ആൾ) അതത് സമയം അറിയാം. അതായത് പുതിയ വിവരങ്ങൾ സെർവർ പറയാതെ തന്നെ സ്വയം കാണാം. ഫോണിൽ വരുന്ന ലൈവ് ക്രിക്കറ്റ് സ്കോർ പോലെ തന്നെയാണ് ഇത്. subscription {
newPerson {
name
age
}
}
ഗ്രാഫ്ക്യുഎല്ലിൽ ഒരു മ്യൂട്ടേഷൻ നടത്തുമ്പോൾ (ഉദാഹരണം: പുതിയൊരു കമന്റ് ചേർക്കൽ), അതുമായി ബന്ധപ്പെട്ട ഫീൽഡുകൾ അപ്ഡേറ്റ് ചെയ്തു സബ്ക്രൈബ് ചെയ്ത എല്ലാ ക്ലൈന്റിലേക്കും പുതിയ ഡാറ്റ അയക്കുന്നു. ഉദാഹരണം: നിങ്ങൾ ഒരു ലൈവ് ചാറ്റ് അപ്ലിക്കേഷനിൽ ആണെന്ന് ചിന്തിക്കുക — ഒരാൾ പുതിയ ഒരു കമന്റ് പോസ്റ്റ് ചെയ്താൽ, അതെ സമയം തന്നെ അത് സബ്സ്ക്രൈബ് ചെയ്ത എല്ലായാളുകളുടെയും സ്ക്രീനിൽ കാണിക്കും – അതാണ് സബ്ക്രിപ്ഷൻ വഴി ലഭിക്കുന്ന അപ്ഡേറ്റ്. സബ്ക്രൈബ്ഡ് ക്ലൈന്റിന് വേണ്ടിയുള്ള ഫോം നേരത്തെ തന്നെ നിർവചിച്ചുവെക്കാം. {
"newPerson": {
"name": "Jane",
"age": 23
}
}
മറ്റ് ക്വറി ഭാഷകളുമായുള്ള താരതമ്യംഗ്രാഫ്ക്യുഎൽ പ്രാഥമിക റീലേഷൻഷിപ്പുകൾ ലഭിക്കാൻ അനുയോജ്യമാണ്. റികർസീവ് ക്വറീസ്(Recursive queries) പോലുള്ള ട്രാൻസിറ്റീവ് ക്ലോഷർ(transitive closure) ഗ്രാഫ്ക്യുഎൽ സപ്പോർട്ട് ചെയ്യില്ല. അതിനാൽ സങ്കീർണ്ണമായ ബന്ധങ്ങളിലൂടെ ഡേറ്റയെ പുനഃപരിശോധിക്കുന്ന പ്രക്രിയ(complex graph traversal) ആവശ്യമായ സാഹചര്യങ്ങളിൽ ഗ്രാഫ്ക്യുഎല്ലിന് പരിമിതമായ കഴിവേയുള്ളു. പരിശോധനഗ്രാഫ്ക്യുഎൽ എപിഐകളെ ഓട്ടോമേറ്റഡ് ടൂളുകൾ ഉപയോഗിച്ച് പരിശോധന നടത്താം. ഈ ടൂളുകൾ ക്വറികൾ അയച്ചു അതിൽ നിന്ന് ലഭിക്കുന്ന ഫലങ്ങളെ സാങ്കേതികമായി പരിശോധിക്കും[12]. കൂടാതെ, ടൈപ്പ് ചെയ്ത സ്കീമയും ഇന്റ്രോസ്പെക്ഷൻ കഴിവുകളും ഉള്ളതിനാൽ, സ്വതേ ടെസ്റ്റുകൾ ഉണ്ടാക്കാനും പുതിയ ക്വറികൾ കണ്ടെത്താനും സെർച്ച്ബേസ്ഡ് തന്ത്രങ്ങൾ ഉപയോഗിക്കാം[13]. ഗ്രാഫ്ക്യുഎൽ ഇംപ്ലിമെന്റേഷനുകൾ ടെസ്റ്റുചെയ്യാൻ ഉപയോഗിക്കുന്ന ചില പ്രധാന സോഫ്റ്റ്വെയർ ടൂളുകൾ ഇവയാണ്:
ഇത് എല്ലാം ചേർന്നാണ് സ്ഥിരതയുള്ള, ശുദ്ധതയുള്ള, വിശ്വസനീയമായ ഗ്രാഫ്ക്യുഎല്ലിനെ വികസിപ്പിക്കുന്നത്[14]. പ്രായോഗിക നടപ്പാക്കലുകൾഗ്രാഫ്ക്യുഎൽ ഉപയോഗിച്ച് വെബ്ബ് ആപ്ലിക്കേഷനുകൾ കൂടുതൽ എളുപ്പവും കാര്യക്ഷമവുമാക്കി നിർമ്മിക്കാനാകും. ഉദാഹരണത്തിന്, ചില മാർഗ്ഗനിർദ്ദേശങ്ങൾ കാണിക്കുന്നത് മോങ്കോഡിബി എന്ന ഡാറ്റാബേസും റിയാക്ട് എന്ന ഫ്രണ്ട്എൻഡ് ഫ്രെയിംവർക്കും ചേർത്ത് എങ്ങനെ ഒരു ആപ്ലിക്കേഷൻ ഗ്രാഫ്ക്യുഎൽ ഉപയോഗിച്ച് സജ്ജീകരിക്കാമെന്ന് പറയുന്നു. അവിടെ ഗ്രാഫ്ക്യുഎൽ സെർവർ എങ്ങനെ സജ്ജമാക്കാം, ഡാറ്റ എങ്ങനെ തേടണം (data fetching), എററുകൾ സംഭവിച്ചാൽ എങ്ങനെ കൈകാര്യം ചെയ്യണം തുടങ്ങിയവയെല്ലാം വിശദമായി പഠിപ്പിക്കുന്നു. ഇതിലൂടെ, ഗ്രാഫ്ക്യുഎൽ വലിയ വെബ്ബ് ആപ്ലിക്കേഷനുകളിൽ ഡാറ്റ കൈമാറ്റം എളുപ്പമാക്കാനും കാര്യക്ഷമമാക്കാനും എത്ര ഉപയോഗപ്രദമാണ് എന്ന് മനസ്സിലാക്കാൻ കഴിയും. അവലംബം
|
Portal di Ensiklopedia Dunia