Skip to content

FollowTheMoney Ontology

The FollowTheMoney (FTM) schema is a standard for representing entities and relationships in investigative journalism, anti-corruption research, and sanctions tracking. This page explains its structure and how it's used in the terrorist organizations use case.

What is FollowTheMoney?

FollowTheMoney is an open-source data model created by the Organized Crime and Corruption Reporting Project (OCCRP) and maintained as part of the OpenSanctions project. It provides:

  • Entity-relationship model for people, companies, and their connections
  • Standard properties for names, identifiers, dates, and locations
  • Relationship types for ownership, employment, sanctions, and more
  • Multi-source integration across jurisdictions and data providers

Origin and Adoption

Year Milestone
2018 Created by OCCRP for investigative journalism
2020 Adopted by OpenSanctions for sanctions data
2022 Used by Aleph (document processing platform)
2024 Standard for 240+ sanctions and PEP datasets

Users: Investigative journalists, compliance teams, law enforcement, intelligence analysts, and researchers worldwide.

Ontology Structure

FTM organizes entities in a hierarchy with Thing as the root:

Thing (root)
├── LegalEntity
│   ├── Person
│   ├── Organization
│   │   ├── Company
│   │   └── PublicBody
│   └── Vehicle
│       └── Airplane
├── Asset
│   ├── BankAccount
│   ├── RealEstate
│   ├── Security
│   └── CryptoWallet
├── Document
│   ├── Article
│   ├── Passport
│   └── Email
└── Address

Relationship Classes (Intervals)

FTM models relationships as first-class entities:

Interval (relationship base)
├── Ownership    (owner → asset)
├── Directorship (director → organization)
├── Employment   (employee → employer)
├── Sanction     (authority → target)
├── Family       (person ↔ relative)
├── Associate    (person ↔ associate)
├── Membership   (member → organization)
└── Representation (representative → client)

This reification allows relationships to have their own properties (dates, sources, amounts).

Key Classes for Sanctions

Person

Individuals subject to sanctions or associated with designated entities.

ftm:Person a rdfs:Class ;
    rdfs:label "Person" ;
    rdfs:comment "A natural person" ;
    rdfs:subClassOf ftm:LegalEntity .

Properties: - name, firstName, lastName - birthDate, birthPlace - nationality, country - passportNumber, idNumber - alias (alternative names)

Organization

Groups, companies, and formal entities.

ftm:Organization a rdfs:Class ;
    rdfs:label "Organization" ;
    rdfs:comment "A formal organization" ;
    rdfs:subClassOf ftm:LegalEntity .

Properties: - name, alias - country, jurisdiction - classification (type of organization) - topics (e.g., "sanction", "crime.terror")

PublicBody

Government agencies and authorities.

ftm:PublicBody a rdfs:Class ;
    rdfs:label "Public body" ;
    rdfs:comment "A government agency or state-controlled entity" ;
    rdfs:subClassOf ftm:Organization .

Used for: - US State Department - UK Home Office - Australia Home Affairs - Other designating authorities

Sanction

The designation relationship between authority and target.

ftm:Sanction a rdfs:Class ;
    rdfs:label "Sanction" ;
    rdfs:comment "A sanction or listing of an entity by an authority" ;
    rdfs:subClassOf ftm:Interval .

Properties: - entity (target of sanction) - authority (issuing body) - program (e.g., "US-FTO219", "UK-PROSCRIBED") - startDate, endDate - reason, summary

Class Statistics

The full FTM ontology contains:

Category Count
Entity classes 60+
Relationship classes 20+
Properties 200+

Classes Used in Terrorist Orgs

Class Usage Count
Organization Designated groups ~294
PublicBody Designating authorities 5
Person Associated individuals ~5
Address Headquarters/locations ~7
Sanction Designation relationships ~161

Aletheia Extensions

The terrorist organizations use case extends FTM with additional relationship types:

HAS_ALIAS Extension

FTM stores aliases as properties, but graph queries need traversable relationships:

ftm:HasAlias a rdfs:Class ;
    rdfs:label "Has Alias" ;
    rdfs:comment "Links an entity to an alternative name" ;
    rdfs:subClassOf ftm:Interval .

Enables queries like:

// Find organization by alias
MATCH (org:Organization)-[:HAS_ALIAS]->(a)
WHERE a.name = 'LeT'
RETURN org.name
// → Lashkar-e-Taiba

Extension file: ontology/extensions/aletheia_extensions.ttl

Example Entities

Organization with Aliases

{
  "schema": "Organization",
  "id": "org-hamas",
  "properties": {
    "name": ["Hamas"],
    "alias": ["Islamic Resistance Movement", "Harakat al-Muqawama al-Islamiya"],
    "country": ["ps"],
    "topics": ["sanction", "crime.terror"]
  }
}

Graph representation:

(Hamas:Organization)
    ├──[:HAS_ALIAS]──► (Islamic Resistance Movement:Entity)
    ├──[:HAS_ALIAS]──► (Harakat al-Muqawama:Entity)
    └──[:SANCTION]──► (US State Department:PublicBody)

Multi-Jurisdiction Sanction

                    ┌──[:SANCTION]──► (US State Department)
(Hizballah) ────────┼──[:SANCTION]──► (UK Home Office)
                    └──[:SANCTION]──► (Australia Home Affairs)

Using FTM in Aletheia

Loading the Ontology

# Load FTM ontology to graph
aletheia build-ontology-graph \
  --use-case terrorist_orgs \
  --knowledge-graph ftm_ontology

Building Knowledge Graph

aletheia build-knowledge-graph \
  --use-case terrorist_orgs \
  --knowledge-graph terrorist_orgs \
  --schema-mode graph-hybrid \
  --ontology-graph ftm_ontology

Viewing the Graph

# Count by entity type
redis-cli GRAPH.QUERY terrorist_orgs \
  "MATCH (n) RETURN labels(n), count(*) ORDER BY count(*) DESC"

# View sanctions relationships
redis-cli GRAPH.QUERY terrorist_orgs \
  "MATCH (org:Organization)-[:SANCTION]->(auth:PublicBody)
   RETURN org.name, auth.name LIMIT 10"

Semantic Alignment Examples

The ontology enables consistent extraction:

Source Text Extracted Entity Ontology Class
"terrorist group" Hamas Organization
"the State Department" US State Department PublicBody
"also known as" LeT HasAlias
"designated by" - Sanction (relationship)
"founder" Person name Person

Benefits for Sanctions Analysis

1. Cross-Jurisdiction Queries

Single query finds all designations:

MATCH (org:Organization)-[:SANCTION]->(auth:PublicBody)
WHERE org.name CONTAINS 'Hamas'
RETURN auth.name
// → US State Department, UK Home Office, Australia Home Affairs

2. Alias Resolution

Find organizations by any known name:

MATCH (org:Organization)-[:HAS_ALIAS]->(a)
WHERE a.name =~ '(?i).*lashkar.*'
RETURN DISTINCT org.name
// → Lashkar-e-Taiba

3. Network Analysis

Trace organizational relationships:

MATCH path = (org:Organization)-[:RELATES_TO*1..3]-(related)
WHERE org.name = 'al-Qaeda'
RETURN path

4. Compliance Integration

FTM data exports directly to compliance systems: - Standardized entity identifiers - Authority-specific program codes - Machine-readable sanctions lists

Source Files

File Location Description
FTM Ontology ontology/followthemoney.ttl Core FTM schema (145 KB)
Extensions ontology/extensions/aletheia_extensions.ttl HAS_ALIAS relationship
Data Files data/*.ftm.json FTM JSON Lines format

Data Sources

The terrorist organizations data comes from OpenSanctions:

Source Dataset Entities
US State Department Foreign Terrorist Organizations ~70
UK Home Office Proscribed Organizations ~80
Australia Home Affairs Listed Terrorist Organizations ~30
Combined (deduplicated) ~294

Further Reading