Modelo de entidades e relacionamentos compatível com o La Referencia.
Deduplicador de entidades.
Importação/Exportação de dados em formato próprio.
Validação/Exportação para carga no La Referencia.
- Estrutura do modelo
- Instalação/Configuração do ambiente
- Parsers
- Deduplicar
- Gerar arquivo de carga La Referencia (usado para poucas/pequenas entidades)
- Gerar arquivos de carga La Referencia (usado para grande volume de dados)
- Filtrar dados baseado em uma lista de identificadores / semanticId
Os dados são estruturados em formato de árvore, permitindo relacionar entidades, além de adicionar atributos e identificadores. A ordem da árvore fica a critério de cada um.
Ex.: 1
Publication
/ | \
/ | \
Person(1) Person(1) OrgUnit(2)
/
OrgUnit(3)
Ex.: 2
Person
/ \
OrgUnit(3) Publication
/ \
/ \
Person(1) OrgUnit(2)
- *1 - Authorship
- *2 - ThesisSponsorship
- *3 - Affiliation
Python >3.8
python3 -m venv .venv
source .venv/bin/activate # .venv\Scripts\activate (windows)
pip install -r requirements.txtExemplo de utilização dos scripts (Enquanto não são realizados os ajustes para transforma-los em uma biblioteca)
Estrutura de diretórios
- raíz
- .venv (python virtualenv)
- seu-projeto (diretório contendo seus scripts python)
- brcris-lib (diretório da biblioteca)
Comandos para criação da estrutura e clone do repositório.
mkdir nome-do-diretorio-raiz && cd nome-do-diretorio-raiz
mkdir nome-do-diretorio-do-projeto
git clone https://github.com/brcris-ibict/brcris-lib.git brcris-lib
source .venv/bin/activate
pip install -r brcris-lib/requirements.txt
touch nome-do-diretorio-do-projeto/main.pyExemplo de código python
import sys
sys.path.append('../brcris-lib/src')
from models.entity import Entity, Value
from models.identifiers import Id, LattesId, OrcidId #, ...
from utils.export.lareferencia import LaReferenciaExporter
# criação da entidade
e1 = Entity('Person', 'lattes')
# identificadores
e1.identifiers.add(LattesId('1234567890123456'))
e1.identifiers.add(OrcidId('0000-0002-0123-208X'))
e1.identifiers.add(Id('email', 'fulano@email.com'))
# campos
e1.fields['name'] = 'Fulano'
e1.fields['name'].add('Fulano da Silva') # exemplo de campos com multiplos valores
e1.fields['location']['city'].add('São Paulo') # campos aninhados (cidade e país dentro de location)
e1.fields['location']['country'] = 'Brasil'
e1.fields['location']['country'].add('Brazil', lang='eng') # campos com multiplos idiomas
e1.fields['phone'].addValue(Value('9999999999'), Value('33333333')) # outra forma de adicionar campos
# criação de outra entidade
e2 = Entity('OrgUnit', 'lattes')
e2.identifiers.add(Id('ror', '123456'))
e2.fields['name'].add('ibict')
# relacionamento entre duas entidades
e1.relations['Affiliation'].add(e2)
# exportador
exporter = LaReferenciaExporter('modelo_brcris.xml')
xml = exporter.toXml(e1)[1]
print(xml)TSV contendo dados da fiocruz, com as seguintes colunas:
- 0: IDLattes
- 1: CPF
- 2: Ingresso
- 3: Sigla Unidade
- 4: Unidade
- 5: localização SGA
- 6: Escolaridade
- 7: Cargo (atual)
- 8: Inatividade
python src/main.py parser tsvfiocruz --input data/fiocruz/Fiocruz_IDLattes.tsv --output data/fiocruz/Fiocruz.jsonDiretório contendo arquivo(s) JSON extraídos do Solr do OasisBR
Campos disponíveis: https://github.com/brcris-ibict/plano-de-gestao/blob/master/docs/campos_oasisbr.csv
python src/main.py parser oasisbr --input_path C:/Users/Tales/Desenvolvimento/certificacao-lattes/data/oasisbr/*.json --output data/oasisbr/OasisBr.json
python .\src\main.py parser oasisbr --input_path "G:\dados\oasisbr\*" --output "G:\dados\seniors (1)\OasisBr.json" --input_filter_ids "G:\dados\seniors (1)\seniorsIds.txt"Arquivo CSV contendo dados de mestres e doutores disponibilizado pelo CNPq com as seguintes colunas:
- 0: NRO_ID_LATTES
- 1: NOME
- 2: TITULO
- 3: NIVEL
- 4: ANO_TERMINO
- 5: ANO_OBTENCAO
- 6: PQ_CATEGORIA_NIVEL
- 7: ORCID
- 8: NRO_ID_ORIENTADOR
- 9: NOME_DO_ORIENTADOR
python src/main.py parser cnpq csv-mestres-e-doutores --input data/cnpq/ArquivoMestresDoutoresLattes.txt --output data/cnpq/CnpqMestresEDoutores.json
python .\src\main.py parser cnpq csv-mestres-e-doutores --input "c:\Users\Tales\Desenvolvimento\Ibict\Data\ArquivoMestresDoutoresLattes20220701\ArquivoMestresDoutoresLattes.txt" --output "C:\Users\Tales\Desenvolvimento\Ibict\Data\08072022\MestresEDoutores.json" --input_filter_ids "c:\Users\Tales\Desenvolvimento\Ibict\Data\08072022\CapesIds.txt" "c:\Users\Tales\Desenvolvimento\Ibict\Data\08072022\CapesIdsProgramsOrgunits.txt" "c:\Users\Tales\Desenvolvimento\Ibict\Data\08072022\OasisbrIds.txt"Arquivo CSV contendo dados de teses e dissertações disponibilizado pelo CNPq com as seguintes colunas:
- 0: NRO_ID_LATTES
- 1: NOME
- 2: TITULO
- 3: NIVEL
- 4: ANO
- 5: PQ_CATEGORIA_NIVEL
- 6: A.ORCID
- 7: NRO_ID_ORIENTADO
- 8: NOME_ORIENTADO
python src/main.py parser cnpq csv-teses-e-dissertacoes --input data/cnpq/ArquivoTesesDissertacoesOrientadasLattes.txt --output data/cnpq/CnpqTesesEDissertacoes.jsonpython .\src\main.py parser cnpq di --input "C:\Users\Tales\Desenvolvimento\Ibict\Scripts\brcristools\data\level0-source\di.csv" --output "G:\dados\seniors (1)\di-tree.json" --input_filter_ids "G:\dados\seniors (1)\seniorsIds.txt" "G:\dados\seniors (1)\oasisbrIds.txt"
python .\src\main.py parser cnpq di-tree --input "C:\Users\Tales\Desenvolvimento\Ibict\Scripts\brcristools\data\level0-source\di_tree_dedup.tsv" --output "G:\dados\seniors (1)\di-tree.json" --input_filter_ids "G:\dados\seniors (1)\seniorsIds.txt" "G:\dados\seniors (1)\oasisbrIds.txt"python .\src\main.py parser cnpq cv-lattes --input_path "G:\dados\seniors (1)\data\repo" --output "G:\dados\seniors (1)\seniors.json" --output_ids "G:\dados\seniors (1)\seniorsIds.txt"Exemplos de parametro de filtros
python src/main.py dedup --input data/cnpq/Equipe.json --output data/cnpq/EquipeDedup.json --filter 'Person<Authorship>Publication' 'Person<Adivisoring>Publication' 'Person<CoAdivisoring>Publication' 'Person<Affiliation>OrgUnit' 'Publication<CourseThesis>Course<IsProgramOf>Program' 'Course<CourseOrgUnit>OrgUnit' 'Publication<ThesisSponsorship>OrgUnit' 'Program<OrgUnitProgram>OrgUnit' 'Publication<Authorship>Person' --strategy 1
python src/main.py dedup --input data/cnpq/Cnpq.json --output data/cnpq/CnpqDedup.json
python src/main.py dedup --input data/cnpq/Cnpq.json data/cnpq/Oasisbr.json --output data/cnpq-oasisbr/CnpqOasisbrDedup.json
python src/main.py dedup-resolve --input 'data/level3-dedup/Di.json' --input_to_resolve 'data/level1-normalized/Fiocruz.json' --output 'data/level3-dedup/FiocruzDi.json' --filter 'OrgUnit<IsUnitOf>OrgUnit' --filter_dedup_base 'OrgUnit<IsUnitOf>OrgUnit' --strategy 3python src/main.py export lareferencia --input=data/cnpq/CnpqEquipeDedup.json --output=data/cnpq/CnpqEquipe.xml --without_community
python src/main.py export lareferencia --input=data/cnpq/CnpqEquipeDedup.json --output=data/cnpq/CnpqEquipe.xml --community TesteEquipe
python src/main.py export lareferencia --input data/fiocruz/Fiocruz.json --output data/fiocruz/Fiocruz.xmlpython src/main.py export lareferencia --input data/fiocruz/Fiocruz.json --output data/fiocruz/xml
python src/main.py export lareferencia --input data/cnpq/CnpqDedup.json --output_path data/cnpq/xml
python .\src\main.py export lareferencia --input "G:\dados\seniors (1)\seniors.json" --output_path "G:\dados\seniors (1)\seniors_xml" --community "Seniors" --community_relations "PersonCommunity" --source "seniors" --output_ids "G:\dados\seniors (1)\seniorsIds2.txt"python src/main.py filter --input data/cnpq/CnpqMestresEDoutores.json data/cnpq/CnpqTesesEDissertacoes.json --input_ids data/ids/equipe.txt --output data/cnpq/CnpqEquipe.json