Skip to main content
Relationships in BR-ACC capture legal, financial, social, and political connections between entities.

Core Relationship Patterns

Corporate & Ownership

Direction: (Partner|Person)-[:SOCIO_DE]->(Company)Represents ownership or partnership in a company.Properties:
  • qualificacao (string): Partner role (Administrador, Sócio, etc.)
  • percentual_capital (float): Ownership percentage (0-100)
  • data_entrada (date): Date became partner
Example Use Cases:
  • Find all companies owned by a person
  • Detect hidden ownership through family members
  • Calculate ultimate beneficial owners
Example Cypher:
MATCH (p:Person {cpf: '12345678900'})-[:SOCIO_DE]->(c:Company)
RETURN c.razao_social, c.cnpj
Direction: (Partner|Person)-[:SOCIO_DE_SNAPSHOT]->(Company)Time-stamped ownership records for temporal analysis.Properties:
  • snapshot_date (date): Date of ownership record
  • membership_id (string): Unique ID for this ownership instance
  • qualificacao (string): Role at that time
  • percentual_capital (float): Ownership percentage
Indexes: membership_id, snapshot_dateExample Cypher:
MATCH (p:Person)-[r:SOCIO_DE_SNAPSHOT]->(c:Company)
WHERE r.snapshot_date = date('2022-01-01')
RETURN p.name, c.razao_social, r.percentual_capital
Direction: (Company)-[:HOLDING]->(Company)Parent-subsidiary relationships.Properties:
  • holding_id (string): Unique holding relationship ID
  • relationship_type (string): Nature of control
  • ownership_percentage (float): Equity stake

Contracts & Procurement

Direction: (Company)-[:VENCEU]->(Contract)Company won a public contract.Properties: Usually none (contract details in Contract node)Example Use Cases:
  • Calculate total contracts by company
  • Detect contract concentration patterns
  • Track sanctioned companies still receiving contracts
Example Cypher:
MATCH (c:Company)-[:VENCEU]->(ct:Contract)
WHERE ct.date >= date('2024-01-01')
RETURN c.razao_social, sum(ct.value) as total_value, count(ct) as num_contracts
ORDER BY total_value DESC
Direction: (Company)-[:MUNICIPAL_VENCEU]->(MunicipalContract)Company won a municipal-level contract.
Direction: (Company)-[:FORNECEU]->(Expense|GovCardExpense)Company supplied goods/services for an expense.
Direction: (Company)-[:MUNICIPAL_LICITOU]->(MunicipalBid)Company participated in a municipal bid.

Political Relationships

Direction: (Person)-[:CANDIDATO_EM]->(Election)Person was a candidate in an election.Properties:
  • party (string): Political party
  • numero (int): Ballot number
  • resultado (string): Result (ELEITO, SUPLENTE, NÃO ELEITO)
Example Cypher:
MATCH (p:Person)-[r:CANDIDATO_EM]->(e:Election {year: 2022})
WHERE r.resultado = 'ELEITO'
RETURN p.name, e.cargo, e.uf
Direction: (Company|Person)-[:DOOU]->(Person)Entity donated to a political campaign.Properties:
  • valor (float): Donation amount in BRL
  • year (int): Election year
  • type (string): Donation type
Example Cypher:
MATCH (c:Company)-[d:DOOU]->(p:Person)-[:CANDIDATO_EM]->(e:Election {year: 2022})
WHERE d.valor > 100000
RETURN c.razao_social, p.name, d.valor
ORDER BY d.valor DESC
Direction: (Person)-[:AUTOR_EMENDA]->(Amendment)Person authored a budget amendment.Example Use Cases:
  • Track which politicians direct funds to specific regions
  • Detect self-dealing (amendments benefiting family companies)
Example Cypher:
MATCH (p:Person)-[:AUTOR_EMENDA]->(a:Amendment)
WHERE a.uf = 'SP' AND a.year = 2024
RETURN p.name, sum(a.value_committed) as total_amendments
ORDER BY total_amendments DESC
Direction: (Amendment)-[:BENEFICIOU]->(Company|Municipality)Amendment directed funds to an entity.
Direction: (Person)-[:GASTOU]->(Expense)Politician made an expense (Cota Parlamentar).

Compliance & Risk

Direction: (Company|Person)-[:SANCIONADA]->(Sanction)Entity received an administrative sanction.Example Use Cases:
  • Check if a company is currently sanctioned
  • Find companies sanctioned but still winning contracts
  • Calculate sanction history
Example Cypher:
MATCH (c:Company)-[:SANCIONADA]->(s:Sanction)
WHERE s.date_end >= date() // Still active
RETURN c.razao_social, s.type, s.reason, s.date_start, s.date_end
Direction: (Company)-[:EMBARGADA]->(Embargo)Company received an environmental embargo.
Direction: (Company|Person)-[:DEVE]->(Debt)Entity owes money to government (taxes, fines, etc.).
Direction: (Company|Person)-[:CVM_SANCIONADA]->(CVMProceeding)Entity sanctioned by securities regulator.

Infrastructure & Services

Direction: (Company)-[:OPERA_UNIDADE]->(Health|Education)Company operates a healthcare or educational facility.Example Cypher:
MATCH (c:Company)-[:OPERA_UNIDADE]->(h:Health)
WHERE h.atende_sus = true
RETURN c.razao_social, h.name, h.uf, h.municipio
Direction: (Company)-[:MANTEDORA_DE]->(Education)Company maintains an educational institution.

Financial Relationships

Direction: (Company)-[:RECEBEU_EMPRESTIMO]->(Finance)Company received a loan (e.g., from BNDES).
Direction: (Company|Municipality)-[:GEROU_CONVENIO]->(Convenio)Entity received a federal grant/agreement.

International & Offshore

Direction: (OffshoreOfficer|Person)-[:OFFICER_OF]->(OffshoreEntity)Person is an officer of an offshore entity.
Direction: (Person|Company)-[:INTERMEDIARY_OF]->(OffshoreEntity)Entity acted as intermediary for offshore structure.
Direction: (Person)-[:GLOBAL_PEP_MATCH]->(GlobalPEP)Person matches an international PEP record.

Entity Resolution

Direction: (Entity)-[:SAME_AS]->(Entity)Two nodes represent the same real-world entity (high confidence).Properties:
  • confidence (float): Match confidence (0.8-1.0)
  • match_method (string): How match was determined
Example Use Cases:
  • Merge person records from different sources
  • Link Partner nodes to Person nodes when CPF matches
  • Resolve company name variations
Example Cypher:
MATCH (p1:Person)-[:SAME_AS]->(p2:Person)
RETURN p1.name, p1.cpf, p2.name, p2.cpf
Direction: (Entity)-[:POSSIBLE_SAME_AS]->(Entity)Two nodes might represent the same entity (requires review).Properties:
  • confidence (float): Match confidence (0.5-0.8)
  • match_method (string): Matching algorithm used
  • similarity_score (float): Name/attribute similarity
Note: Many queries exclude these by default to avoid false positives.

Family & Social

Direction: (Person)-[:CONJUGE_DE]->(Person)Marriage relationship.
Direction: (Person)-[:PARENTE_DE]->(Person)Family relationship (parent, child, sibling).Properties:
  • relationship_type (string): Specific relationship
Direction: (Person)-[:PARTY_MEMBER]->(PartyMembership)Person is affiliated with a political party.

Public Office

Direction: (Person)-[:HOLDS]->(PublicOffice)Person currently holds a public office.
Direction: (Person)-[:RECEBEU_SALARIO]->(PublicOffice)Person received salary from public office.
Direction: (Person|Company)-[:INVESTIGATED_IN]->(Investigation)Entity is subject of an investigation.
Direction: (Person|Company)-[:PARTY_IN]->(LegalCase|JudicialCase)Entity is party to a legal case.Properties:
  • role (string): Plaintiff, defendant, etc.
Direction: (Person)-[:TESTIFIED_IN]->(InquirySession)Person testified in a congressional inquiry hearing.
Direction: (Person|Company)-[:SUMMONED_BY]->(InquiryRequirement)Entity summoned by congressional inquiry.

Metadata & Provenance

Direction: (Entity)-[:SOURCED_FROM]->(SourceDocument)Entity was created from this source document.Properties:
  • extraction_date (datetime): When data was extracted
Direction: (Entity)-[:CREATED_BY]->(IngestionRun)Entity was created by this ETL pipeline run.
Direction: (Entity)-[:HAS_VIOLATION]->(TemporalViolation)Entity has a data quality issue (e.g., impossible dates).

User & Investigation Workspace

Direction: (User)-[:TRACKS]->(Entity)User is tracking this entity in an investigation.
Direction: (Entity)-[:ANNOTATED]->(Annotation)User added an annotation to this entity.
Direction: (Entity)-[:TAGGED]->(Tag)User added a tag to this entity.

Multi-Hop Path Queries

Many investigation patterns use multi-hop path queries:

Self-Dealing Detection

// Find politicians whose family members own companies winning contracts
// funded by their amendments
MATCH path = (politician:Person)-[:AUTOR_EMENDA]->(a:Amendment),
             (politician)-[:CONJUGE_DE|PARENTE_DE]->(family:Person),
             (family)-[:SOCIO_DE]->(company:Company),
             (company)-[:VENCEU]->(contract:Contract)
WHERE a.municipality = contract.contracting_org
RETURN politician.name, family.name, company.razao_social, 
       contract.object, contract.value, a.value_committed

Donation-Contract Loop

// Find companies that donated to politicians then won contracts
// from their government entities
MATCH (company:Company)-[d:DOOU]->(politician:Person),
      (politician)-[:CANDIDATO_EM]->(e:Election),
      (company)-[:VENCEU]->(contract:Contract)
WHERE contract.date > date(e.year + '-01-01')
  AND contract.contracting_org CONTAINS politician.uf
RETURN company.razao_social, politician.name, d.valor, 
       contract.value, contract.date
ORDER BY contract.value DESC

Sanctioned Network Exposure

// Find all companies connected to a sanctioned company
// within 3 degrees of separation
MATCH (sanctioned:Company)-[:SANCIONADA]->(s:Sanction)
WHERE s.date_end >= date()
MATCH path = (sanctioned)-[:SOCIO_DE*1..3]-(connected:Company)
RETURN sanctioned.razao_social, 
       collect(DISTINCT connected.razao_social) as connected_companies,
       length(path) as degrees_of_separation

Relationship Directionality

Most relationships have semantic direction:
  • Ownership flows “up”: Partner → Company
  • Benefits flow “down”: Company → Contract, Amendment → Municipality
  • Causality flows forward: Bid → Contract, Election → Candidacy
When querying, you can use:
  • -> for directional matching
  • - for bidirectional matching (ignores direction)

Next Steps

Common Query Patterns

Learn common Cypher patterns for investigations

Schema Reference

View complete constraint and index definitions

Build docs developers (and LLMs) love