Introduction

This article describes the development of a metadata management system for research data that integrates GakuNin RDM (Research Data Management) with the Dydra RDF database. This system can handle file management for research projects and the registration and search of Dublin Core metadata in an integrated manner.

System Overview

Architecture

GakRAN(uDPeANMIxpitpn.jRsou1tD4eyRrdDD)rFBa

Main Technology Stack:

  • Next.js 14 (App Router)
  • NextAuth.js (OAuth 2.0 authentication)
  • Dydra (RDF database)
  • GakuNin RDM API
  • SPARQL (query language)

1. Integration with GakuNin RDM

1.1 OAuth 2.0 Authentication Implementation

GakuNin RDM supports OAuth 2.0 authentication. I implemented this using NextAuth.js.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

1.2 Automatic Token Refresh

To maintain long-running sessions, I implemented automatic access token refresh functionality.

a}syi}i}rnffectttcci}tO(oooT(oofujnakkkotnncr}rwceeekoss(oe;nticnnnekttsntare(no...nehGsucext{iuarencsoetr.cfpotncexe.uhutnteriktitcfpxerolrosereoa)eripxrudne{kssenklseripelRefeThs;e{sserindewrnoTAnlThsartRfe,kot,ooTAteTerasek:gkotisifechneaiekoAmrsce:nMcnne=nteehed:acn)ssTrto=ac=h&soerhu=ch{&kfe.naceM=terfftcaocatonerl,ccuktcoksseoocnhukehsouuot(.ren=ehrsnu.rfrnde(etneele.uaTdDr.txfonrswoTaa.proteiakot}crierTfnieke)cers(irgtne.efehDmesnn{srsaesrr.sose_5theea.w_sae>Tffcr(thtm.=orrce)o_;inkeeefktnotesssr/eouwonhhsenkt(k)A_s1;ee)etcth0nsn{oco_0;/.kekt0beeseo)e1xnsnkf0pT,e+o0ionr0rkre)ee?e;sn?feA(rxtttepoosi-kkhreeey3nnd)0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

1.3 Retrieving Projects and Files

Projects and files are retrieved through the GakuNin RDM API.

c)c)o;o;n"{}n`{}RshRshetth}etth}tte,tte,rrpaArfpaAiesduiisdues:etel:etvprhve/rhi/sois/sonna:rnRa:rgspigepiei{zsi{zp.afp.ar=rtiortodilndijamoesmoew.nse.ncan:n:tiii=iti`ni`l.Ba.Bifaeswaesecatacatt.roi.rcjertjehprapr(/gf/v$eev$2{t2{/sc/suehness(osesdsrieisoso/n/nm.$.ea{a/cpcncrcoeoedsjsesessTcT/oto?kIkfedein}nl}/}t`f`e,i,rl[ecsa/t$e{gporroyv]i=dperro}j/e`c,t",

2. Utilizing the Dydra RDF Database

2.1 Managing Private Data

Dydra is originally a public RDF database, but by using API tokens, it is possible to manage private data.

Setting Environment Variables:

DDDYYYDDDRRRAAA___ARACEPCPIOO_USTNIOTTK=OEyRNoY=u=yryo-ouaurcr-c-soreuecnprtoesti-ttoorkyen

Querying with API Token:

c)o;n`{}shttmh}b}tee,o)rpta''dq,eshdAAyus:oecu:epdrctr/:sehnynd:poe:sy'trwedP{'isrO:zUp=aSaRa.T'tLrac'aiSqwo,poelampnaQi/l'rut$i:ce{chrfaa`PyectBa,tciercooaahunrm(n/estsr(}p{/a$$r{{qprlre-oprcoeesssiustl.otersny+v}j./sDsoYpnDa'Rr,Aq_lA`P,I_TOKEN}`,

2.2 Data Separation Using Named Graphs

By using Named Graphs, data is logically separated per project.

Named Graph Design:

By using the resource URIs obtained from the GakuNin RDM API directly as Named Graph URIs, the correspondence between data provenance and graphs is made clear.

IntegratedGraph:https://api.rdm.nii.ac.jp/v2/nodes/{projectId}/

By integrating all data related to a project (metadata, SKOS subjects, profiles) into a single Named Graph, the following benefits are achieved:

  • Simple queries: No need to combine multiple graphs with UNION
  • Efficient search: Easy cross-search of metadata and SKOS subjects
  • Data consistency: All data managed within the same graph
  • Interoperability with external systems: Direct correspondence between RDM resource URIs and RDF graphs
  • Simplified management: Reduced operational burden through unified graph URIs

For example, when dc:subject in metadata references a SKOS concept, it can be directly JOINed within the same graph to retrieve subject labels:

SFW}ERHLOE??EMRfsCEiuT<lbh{ej?teftddcipcctls::e:tss/iuk?/tbotaljsipee:ticpl.?trertedi?f?mtsLs.luaunebbbijeji;ele.ccat?tcsL..uajbbpje/elvc2t/Lnaobdeels/.{projectId}/>

Specifying Named Graph during metadata registration:

cc`oo;nnPPI}ssRRNttEESG}FFERgiIIRA<rnXXTP$asH{ddddpeddDrcccchrccA<e::::Ut:tT$stcdsrQeA{oireuiu<rgutesbehm{rrlacj=rtsacetreyt:peoic`phU"rpth=:<Ur$tt/hri{"i<t`/ti}m$o$ppt}>e{n{sup>tmm:r:aae"e/l{dt$t/.daa{aapctdmdprutaaeaigre.ttt./lrtaaard.mi.d.dcstcasmr:lrtu.egBeeabnl/i}a.jiedb"tdeimcloec.e/i;rstanto}c}cteg"r>.srrij/ma;pp1spt/./hiv1>io2/cn/>R}ne"osdo;eusr/c$e{p;rojectId}/`;

Project-level search:

cc`oo;nnPPSFW}ssRRERHttEELOE?OFFFEMRrPIgsIICEeddTLreXXT<sccITaa${o::OEprdd?{utcNRhcccrgrirA(Uh:tercteLCrQesaelaOiu<ropet{NehmuhaoT=rtsrU?r?Ayt:crdtrI`peici?eNh=:<}ttcsSt/h?>elro(t`/ttreeuLpptimarCsupts;tcA:r:l:oeS/leBrE/.id(ap?b.c?prucl:tigrridi./leoetrd.agsldctrcemroar).egrpi,nl/hpied?itLimcdciC.e/eRoAantsenSctecsE.srro?(j/miud"p1spre$/./tcs{v1>ieck2/ore/>n;iynpwotodireodsn}/"$}){)p)rojectId}/`;

2.3 Dublin Core Metadata Schema

All 15 Dublin Core elements are fully supported.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

3.1 Metadata Registration Flow

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

Registration API Implementation:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

3.2 Advanced Search Functionality

A keyword search across multiple Dublin Core fields is implemented.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

4. SKOS Subject Hierarchy Management

4.1 SKOS Concept Schema Implementation

SKOS (Simple Knowledge Organization System) was adopted for managing the hierarchical structure of subjects.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

SPARQL query for SKOS registration:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

4.2 Retrieving Hierarchical Structure and Utilizing Subject Labels

Thanks to the integrated graph, metadata and subject relationships can be easily queried:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

5. Project RDF Export Feature

5.1 Retrieving Project-Wide RDF Data

Thanks to the integrated graph, all data (metadata, SKOS subjects, profiles) can be exported with a single CONSTRUCT query.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

6. UI Component Design

6.1 Metadata Editor

A form component that allows editing of all 15 Dublin Core elements is implemented.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

6.2 Search Interface

Both keyword search and field-specific search are supported.

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

7. Security and Performance

7.1 Authentication and Access Control

  • Session validation at all API endpoints
  • Automatic access token refresh
  • Project-level data separation using Named Graphs

7.2 Performance Optimization

  • Server-side rendering with Next.js App Router
  • SPARQL query optimization (use of OPTIONAL clauses)
  • Preemptive token refresh (5 minutes before expiry)

8. Deployment and Infrastructure

8.1 Deploying to Vercel

a}syi}i}rnffectttcci}tO(oooT(oofujnakkkotnncr}rwceeekoss(oe;nticnnnekttsntare(no...nehGsucext{iuarencsoetr.cfpotncexe.uhutnteriktitcfpxerolrosereoa)eripxrudne{kssenklseripelRefeThs;e{sserindewrnoTAnlThsartRfe,kot,ooTAteTerasek:gkotisifechneaiekoAmrsce:nMcnne=nteehed:acn)ssTrto=ac=h&soerhu=ch{&kfe.naceM=terfftcaocatonerl,ccuktcoksseoocnhukehsouuot(.ren=ehrsnu.rfrnde(etneele.uaTdDr.txfonrswoTaa.proteiakot}crierTfnieke)cers(irgtne.efehDmesnn{srsaesrr.sose_5theea.w_sae>Tffcr(thtm.=orrce)o_;inkeeefktnotesssr/eouwonhhsenkt(k)A_s1;ee)etcth0nsn{oco_0;/.kekt0beeseo)e1xnsnkf0pT,e+o0ionr0rkre)ee?e;sn?feA(rxtttepoosi-kkhreeey3nnd)0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

8.2 GakuNin RDM OAuth Configuration

Redirect URI registration:

a}syi}i}rnffectttcci}tO(oooT(oofujnakkkotnncr}rwceeekoss(oe;nticnnnekttsntare(no...nehGsucext{iuarencsoetr.cfpotncexe.uhutnteriktitcfpxerolrosereoa)eripxrudne{kssenklseripelRefeThs;e{sserindewrnoTAnlThsartRfe,kot,ooTAteTerasek:gkotisifechneaiekoAmrsce:nMcnne=nteehed:acn)ssTrto=ac=h&soerhu=ch{&kfe.naceM=terfftcaocatonerl,ccuktcoksseoocnhukehsouuot(.ren=ehrsnu.rfrnde(etneele.uaTdDr.txfonrswoTaa.proteiakot}crierTfnieke)cers(irgtne.efehDmesnn{srsaesrr.sose_5theea.w_sae>Tffcr(thtm.=orrce)o_;inkeeefktnotesssr/eouwonhhsenkt(k)A_s1;ee)etcth0nsn{oco_0;/.kekt0beeseo)e1xnsnkf0pT,e+o0ionr0rkre)ee?e;sn?feA(rxtttepoosi-kkhreeey3nnd)0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

Summary

This system addressed the following technical challenges:

  1. OAuth 2.0 authentication implementation - Secure integration with GakuNin RDM
  2. Automatic token refresh - Maintaining long-running sessions
  3. Data separation using Named Graphs - Project-level management
  4. Private RDF data management - Access control via API tokens
  5. Full Dublin Core support - Standard metadata schema implementation
  6. SKOS subject hierarchy management - Structured subject classification
  7. SPARQL search - Flexible metadata search

This system contributes to the promotion of open science as a practical solution for research data management.

References

Source Code

The complete source code is published in the following repository: https://github.com/nakamura196/next-dydra