Skip to content

Facebook Entity Graph Research

Facebook’s graph connects:

  • 3+ billion user profiles
  • Hundreds of billions of relationships
  • Every type of social entity: people, pages, posts, photos, videos, events, places, groups, comments, reactions…

They’ve solved problems at scale we’ll never face, but their entity modeling decisions are invaluable research.


Engineers, researchers, and product leads behind Facebook’s graph systems.

PersonRoleProjectEra
Mark ZuckerbergCEO, ArchitectSocial Graph concept2007+
Bret TaylorCTOPlatform, Open Graph Protocol2009-2012
Mike SchroepferCTOInfrastructure2013-2021
David RecordonDeveloper AdvocateOpen Graph Protocol design2010
PersonRoleProjectEra
Lars RasmussenEngineering LeadGraph Search (ex-Google Maps)2011-2013
Tom StockyProduct LeadGraph Search2011-2013
PersonAffiliation
Nathan BronsonFacebook
Zach AmsdenFacebook
George Cabrera IIIFacebook
Prasad ChakkaFacebook
Peter DimovFacebook
Hui DingFacebook
Jack FerrisFacebook
Anthony GiardulloFacebook
Sachin KulkarniFacebook
Harry LiFacebook
Mark MarchukovFacebook
Dmitri PetrovFacebook
Lovro PuzarFacebook
Yee Jiun SongFacebook
Venkat VenkataramaniFacebook
PersonAffiliation
Michael CurtissFacebook
Iain ConeyFacebook
Jimmy LennonFacebook
Subbu SivanenFacebook
et al.Facebook
PersonPaperYear
Johan Ugander”Anatomy of the Facebook Social Graph”2011
Brian Karrer”Anatomy of the Facebook Social Graph”2011
Lars Backstrom”Anatomy of the Facebook Social Graph”2011
Cameron Marlow”Anatomy of the Facebook Social Graph”2011

The og: meta tags that let any webpage become a “rich object” in Facebook’s graph.

Questions:

  • What object types does Open Graph define?
  • How do they handle relationships between objects?
  • What’s required vs optional?
  • How has it evolved since 2010?

Source: https://ogp.me/

The public API exposes their entity model.

Known entity types (to verify/expand):

  • User
  • Page
  • Post
  • Photo
  • Video
  • Album
  • Comment
  • Group
  • Event
  • Place/Location
  • Link
  • Application

Questions:

  • What fields does each entity have?
  • What relationship types exist (edges)?
  • How do permissions/privacy work per entity?
  • What’s deprecated vs current?

Source: https://developers.facebook.com/docs/graph-api/reference

How has Facebook’s graph changed over time?

Key milestones to research:

  • 2007: Facebook Platform launches (apps can access graph)
  • 2010: Open Graph Protocol introduced
  • 2012: Timeline/structured life events
  • 2013: Graph Search (natural language queries over graph)
  • 2018+: Privacy changes post-Cambridge Analytica
  • 2020s: Metaverse/Meta rebrand — new entity types?

Facebook calls relationships “edges.” What types exist?

Known edge types:

  • friend (bidirectional)
  • follow (unidirectional)
  • like
  • member_of (group)
  • attending (event)
  • tagged_in
  • author_of
  • comment_on
  • reaction_to

Questions:

  • Are edges typed or just generic connections?
  • Do edges have properties (timestamps, context)?
  • How do they handle edge cardinality (one-to-one, one-to-many, many-to-many)?

Facebook popularized the term. What does it actually mean in their implementation?

Research:

  • Original 2007 F8 presentation
  • Academic papers on Facebook’s architecture
  • Engineering blog posts

AspectFacebookEntity Experiments
ID formatNumeric IDs (big integers)NanoID (8 char random)
Core entityUser/Pageperson/organization
Relationships”Edges” with typesTyped relationships
PrivacyPer-entity, per-edgeTBD
SchemaEvolving, versionedExperimental

  1. How does Facebook handle entity type evolution? Adding new types, deprecating old ones?
  2. What’s the relationship between User and Page? Both are “actors” but different types
  3. How do they model “content” vs “container”? Post vs Album vs Timeline
  4. What entity types exist for Marketplace, Dating, Workplace? Vertical-specific entities?
  5. How do they handle “the same thing” across products? A video on Facebook vs Instagram vs WhatsApp

  • Open Graph Protocol specification deep-dive — Complete: Full type system documented (music, video, article, book, profile, website, payment.link) with all properties and namespaces
  • Graph API reference documentation analysis — Complete: User, Page, Post, Photo, Video, Album, Group, Event, Place, Comment schemas documented with all fields and edges
  • Facebook engineering blog posts on graph architecture — Complete: TAO, Unicorn, Dragon, Graph Search architecture documented
  • Academic papers on Facebook’s social graph — Complete: “Anatomy of the Facebook Social Graph” (721M users, 68.7B friendships, 4.7 avg distance)
  • Comparison: Facebook Graph API vs Google’s APIs vs Twitter’s API — Complete: Entity type comparison table (User/Post/Place across platforms), ID formats, relationship models
  • Privacy/permission model for entities — Complete: Per-entity privacy, per-edge privacy, audience selector, mutual confirmation, API permission requirements
  • Instagram/WhatsApp entity integration (post-acquisition) — Complete: IG User/Media/Comment/Hashtag/Container, WhatsApp Message types, Threads User/Post, Accounts Center cross-product linking

  • “The Anatomy of the Facebook Social Graph” (2012 paper)
  • “TAO: Facebook’s Distributed Data Store for the Social Graph” (2013)
  • Various reverse-engineering analyses
  • F8 2007, 2010, 2019 keynotes
  • Zuckerberg’s “social graph” presentations
  • Open Graph launch announcements


Official Source: https://ogp.me/

The Open Graph Protocol defines a complete type system for representing objects in social graphs:

  • og:title — The object’s title
  • og:type — The object type (from list below)
  • og:image — Image URL representing the object
  • og:url — Canonical URL (permanent ID in graph)
  • og:audio — Audio file URL
  • og:description — 1-2 sentence description
  • og:determiner — Article (a, an, the, "", auto)
  • og:locale — Locale (default: en_US)
  • og:locale:alternate — Array of other available locales
  • og:site_name — Parent site name
  • og:video — Video file URL

Music Types (Namespace: https://ogp.me/ns/music#)

Section titled “Music Types (Namespace: https://ogp.me/ns/music#)”
TypeProperties
music.songduration, album (array), album:disc, album:track, musician (profile array)
music.albumsong, song:disc, song:track, musician, release_date
music.playlistsong, song:disc, song:track, creator (profile)
music.radio_stationcreator (profile)

Video Types (Namespace: https://ogp.me/ns/video#)

Section titled “Video Types (Namespace: https://ogp.me/ns/video#)”
TypeProperties
video.movieactor (profile array), actor:role, director (profile array), writer (profile array), duration, release_date, tag (string array)
video.episodeSame as movie + series (video.tv_show)
video.tv_showSame as movie
video.otherSame as movie
TypeNamespaceProperties
articlehttps://ogp.me/ns/article#published_time, modified_time, expiration_time, author (profile array), section, tag (string array)
bookhttps://ogp.me/ns/book#author (profile array), isbn, release_date, tag (string array)
payment.linkhttps://ogp.me/ns/payment#description, currency (ISO 4217), amount, expires_at, status (PENDING/PAID/FAILED/EXPIRED), id, success_url
profilehttp://ogp.me/ns/profile#first_name, last_name, username, gender (male/female)
websitehttps://ogp.me/ns/website#(no additional properties)

Key Design Insight: OGP uses vertical-specific namespaces to extend base properties. Any unmarked webpage defaults to og:type website. CURIEs allow custom types via prefix notation.


Core Architecture (USENIX ATC 2013):

  • 1 billion reads/second, millions of writes/second
  • Tens of petabytes of data across thousands of machines
  • 500:1 read-to-write ratio, optimized for reads
  • Sub-millisecond read latencies (~1ms average)
  • 99.99%+ availability

Data Model:

  • Objects (nodes): 64-bit Object Identifiers (OID), typed with key-value data
  • Associations (edges): Source ID, association type (atype), destination ID, timestamp, data
  • Two objects can only have one association of the same type
  • Association lists ordered by time

Authors: Nathan Bronson, Zach Amsden, George Cabrera III, Prasad Chakka, Peter Dimov, Hui Ding, Jack Ferris, Anthony Giardullo, Sachin Kulkarni, Harry Li, Mark Marchukov, Dmitri Petrov, Lovro Puzar, Yee Jiun Song, Venkat Venkataramani

Primary Entities:

  • User, Page, Post, Photo, Video, Album, Comment, Group, Event, Place, Application, LiveVideo, Reaction

Reaction Types: LIKE, LOVE, WOW, HAHA, SAD, ANGRY, THANKFUL, PRIDE, CARE, FIRE, HUNDRED

Instagram Entities: IG User, IG Media, IG Comment, IG Container, IG Hashtag


Complete Facebook Graph API Entity Schemas

Section titled “Complete Facebook Graph API Entity Schemas”
FieldTypeDescription
idstringUser’s unique ID
namestringFull name
first_namestringFirst name
last_namestringLast name
emailstringEmail (requires permission)
birthdaystringBirthday (MM/DD/YYYY)
genderstringGender
linkurlProfile URL
pictureobjectProfile picture
hometownPageHometown
locationPageCurrent city
relationship_statusstringSee relationship types above
significant_otherUserPartner (if confirmed)

Edges: /friends, /family (deprecated), /likes, /posts, /photos, /videos, /albums, /groups, /events, /accounts (pages managed)

FieldTypeDescription
idstringPage ID
namestringPage name
aboutstringShort description
categorystringe.g., “Internet Company”
category_listarrayMultiple categories
descriptionstringLong description
websiteurlExternal website
locationLocationPhysical location
phonestringContact phone
fan_countintNumber of likes
followers_countintNumber of followers
overall_star_ratingfloat1-5 star rating
rating_countintNumber of ratings
verification_statusstringVerified status
coverCoverPhotoCover image
pictureProfilePictureProfile image

Edges: /posts, /photos, /videos, /events, /feed, /ratings, /roles, /locations

FieldTypeDescription
idstringPost ID
messagestringText content
storystringAuto-generated story text
created_timedatetimeCreation timestamp
updated_timedatetimeLast update timestamp
fromUser/PageAuthor
toarrayTarget profiles
typeenumlink, status, photo, video, offer
status_typestringMore specific type
permalink_urlurlPermanent link
sharesobjectShare count
privacyPrivacyPrivacy settings
placePlaceTagged location
is_publishedboolPublished status
is_hiddenboolHidden from timeline

Edges: /comments, /reactions, /likes, /attachments, /sharedposts, /insights

FieldTypeDescription
idstringPhoto ID
albumAlbumParent album
created_timedatetimeUpload timestamp
fromUser/PageUploader
imagesarrayDifferent size URLs
widthintWidth in pixels
heightintHeight in pixels
namestringCaption
linkurlFacebook link
pictureurlThumbnail URL
sourceurlFull-size URL
placePlaceTagged location

Edges: /tags (with x, y coordinates), /comments, /reactions, /likes

FieldTypeDescription
idstringVideo ID
created_timedatetimeUpload timestamp
descriptionstringVideo description
titlestringVideo title
fromUser/PageUploader
lengthfloatDuration in seconds
sourceurlVideo file URL
pictureurlThumbnail
embed_htmlstringEmbed code
formatarrayAvailable formats
live_statusstringnone, live, live_stopped
permalink_urlurlPermanent link

Edges: /comments, /reactions, /likes, /tags, /thumbnails

FieldTypeDescription
idstringAlbum ID
namestringAlbum title
descriptionstringDescription
countintNumber of photos
typeenumprofile, mobile, wall, normal
cover_photoPhotoCover image
created_timedatetimeCreation timestamp
updated_timedatetimeLast update
fromUser/PageCreator
linkurlFacebook link
privacystringPrivacy setting

Edges: /photos, /comments, /likes, /picture

FieldTypeDescription
idstringGroup ID
namestringGroup name
descriptionstringDescription
privacyenumOPEN, CLOSED, SECRET
created_timedatetimeCreation timestamp
updated_timedatetimeLast activity
ownerUserCreator
coverCoverPhotoCover image
iconurlGroup icon
member_countintNumber of members
is_communityboolCommunity flag

Edges: /members (deprecated), /admins, /feed, /photos, /videos, /events, /files

FieldTypeDescription
idstringEvent ID
namestringEvent title
descriptionstringDescription
start_timedatetimeStart timestamp
end_timedatetimeEnd timestamp
timezonestringTimezone name
placePlaceVenue
coverCoverPhotoCover image
ownerUser/PageHost
is_canceledboolCancellation status
attending_countintRSVP: attending
maybe_countintRSVP: maybe
declined_countintRSVP: declined
invited_countintTotal invited
event_timesarrayRecurring instances
ticket_uriurlTicket link
typeenumprivate, public, group, community

Edges: /attending, /maybe, /declined, /noreply, /photos, /videos, /feed

FieldTypeDescription
idstringPlace ID
namestringPlace name
locationLocationGeographic data
overall_ratingfloat1-5 stars

Location Object:

FieldTypeDescription
latitudefloatGPS latitude
longitudefloatGPS longitude
streetstringStreet address
citystringCity name
statestringState/province
zipstringPostal code
countrystringCountry name
located_instringParent location ID
FieldTypeDescription
idstringComment ID
messagestringComment text
created_timedatetimeCreation timestamp
fromUser/PageAuthor
parentCommentParent comment (for replies)
attachmentAttachmentMedia attachment
comment_countintReply count
like_countintLike count
can_removeboolCan user remove
is_hiddenboolHidden status

Edges: /comments (replies), /reactions, /likes


FieldTypeDescription
idstringInstagram user ID
ig_idintLegacy Instagram ID
usernamestring@handle
namestringDisplay name
biographystringBio text
websiteurlProfile link
followers_countintFollower count
follows_countintFollowing count
media_countintPost count
profile_picture_urlurlAvatar URL
shopping_product_tag_eligibilityboolCan tag products

Edges: /media, /stories, /live_media, /tags, /insights, /mentioned_media

FieldTypeDescription
idstringMedia ID
ig_idstringLegacy Instagram ID
media_typeenumIMAGE, VIDEO, CAROUSEL_ALBUM
media_product_typeenumFEED, REELS, STORIES
captionstringCaption text
timestampdatetimePost timestamp
permalinkurlInstagram link
media_urlurlContent URL
thumbnail_urlurlVideo thumbnail
usernamestringOwner’s username
ownerIG UserOwner object
is_comment_enabledboolComments allowed
comments_countintComment count
like_countintLike count
shortcodestringURL shortcode
childrenarrayCarousel children

Edges: /comments, /insights, /children

FieldTypeDescription
idstringComment ID
textstringComment text
timestampdatetimeCreation timestamp
fromobjectAuthor (id, username)
like_countintLike count
hiddenboolHidden status
userIG UserAuthor user object

Edges: /replies

FieldTypeDescription
idstringHashtag ID (static, global)
namestringTag without #

Edges: /recent_media, /top_media

Limitation: Max 30 unique hashtags per 7-day rolling window

Used for media publishing workflow.

FieldTypeDescription
idstringContainer ID
statusenumEXPIRED, ERROR, FINISHED, IN_PROGRESS, PUBLISHED
status_codestringError code if failed
copyright_check_statusobjectCopyright check result

FieldTypeDescription
idstringThreads user ID
usernamestring@handle
namestringDisplay name
threads_profile_picture_urlurlAvatar
threads_biographystringBio text
is_verifiedboolVerification badge
FieldTypeDescription
idstringPost ID
media_product_typestringAlways “THREADS”
media_typeenumTEXT_POST, IMAGE, VIDEO, CAROUSEL_ALBUM, AUDIO, REPOST_FACADE
textstringPost content
permalinkurlThread link
timestampdatetimeISO 8601
ownerstringUser ID
usernamestringAuthor’s handle
shortcodestringURL code
thumbnail_urlurlVideo thumbnail
childrenarrayCarousel items
is_quote_postboolQuote post flag
quoted_poststringQuoted post ID

FieldTypeDescription
idstringWAMID (max 128 chars)
typeenumtext, image, video, audio, document, sticker, contacts, location, interactive, template
fromstringSender phone number
timestampintUnix timestamp
biz_opaque_callback_datastringCustom tracking data

Message Types:

  • text — Simple text content
  • media — Image, video, audio, document, sticker
  • contacts — Contact cards
  • location — Geographic coordinates
  • interactive — Lists, reply buttons, product messages
  • template — Pre-approved templates

Status Values: sent, delivered, read, failed, deleted


AspectFacebook/MetaTwitter/XGoogle
Core User EntityUser (64-bit ID)UserPerson (resourceName)
Content EntityPost, Photo, VideoTweet/Post-
Group EntityGroup, Event--
Place EntityPlace, LocationPlacePlace
Relationship ModelTyped edges (TAO)Follow relationshipcontactGroups
ID FormatNumeric (64-bit)Numeric (snowflake)String (people/{id})
Privacy ModelPer-entity + per-edgePublic/protectedPer-contact
  • Post (formerly Tweet): id, text, created_at, author_id, conversation_id, entities (hashtags, mentions, urls)
  • User: id, name, username, created_at, description, verified, profile_image_url
  • Space: id, state, title, host_ids, speaker_ids, participant_count
  • List: id, name, description, owner_id, member_count, follower_count
  • Media: media_key, type, url, duration_ms, height, width
  • Poll: id, options, duration_minutes, end_datetime, voting_status
  • Place: id, full_name, country, geo (coordinates)
  • names: given, family, display
  • emailAddresses: value, type
  • phoneNumbers: value, type
  • addresses: formatted, type
  • organizations: name, title, department
  • birthdays: date
  • photos: url
  • relations: person, type (spouse, child, etc.)
  • metadata: source, primary flag

Accounts Center: Unified identity system linking Facebook, Instagram, WhatsApp, and Meta Horizon.

Connected Experiences:

  1. Cross-posting — WhatsApp Status → Facebook/Instagram Stories
  2. Unified login — Use one account to access others
  3. Profile sync — Name, username, avatar synced across platforms
  4. Shopping — Wishlists synced across Facebook/Instagram

Entity Relationships Across Products:

  • Facebook User ↔ Instagram Account (linked in Accounts Center)
  • Instagram User ↔ Threads User (automatic linking)
  • WhatsApp number ↔ Facebook account (optional linking)
  • All profiles can share a Meta Horizon avatar

ID Namespacing: Each product maintains its own ID space. Cross-product identity is managed through Accounts Center, not shared IDs.

  • Launched January 2013, called Facebook’s “third pillar”
  • Natural language queries: “my friends in New York who like Jay-Z”
  • Built by Lars Rasmussen and Tom Stocky (both ex-Google)
  • Zuckerberg admitted in 2014 it “doesn’t work” (worked less than half the time)
  • Deprecated June 2019

”Anatomy of Facebook Social Graph” Paper (2011)

Section titled “”Anatomy of Facebook Social Graph” Paper (2011)”
  • 721 million active users, 68.7 billion friendships
  • 99.91% of users in single connected component
  • Average pairwise distance: 4.7 (confirms “six degrees of separation”)
  • 5,000 friendship limit per user
  • 2007: Facebook Platform launches at F8 with “social graph” concept
  • 2010: Open Graph Protocol announced, Like button (1B buttons in 24 hours)
  • 2012: Timeline with structured life events
  • 2018: Cambridge Analytica restrictions (87M users affected)
  • Current: 3.07 billion monthly active users, 1 trillion+ edges

  1. 64-bit IDs: Universal identifier format across all entities
  2. Typed associations: Relationships explicitly typed (friend, follow, like, etc.)
  3. Timestamps on edges: Enables time-based ordering/filtering
  4. Privacy per-edge: Visibility controlled at relationship level
  5. 500:1 read optimization: Entire architecture built for reads
  6. Product-specific namespaces: Each Meta product (FB, IG, WA, Threads) has its own ID space
  7. Vertical-specific schemas: OGP uses namespaces for music, video, article, book, profile verticals

Actors (can take actions):

  • Facebook: User, Page, Application
  • Instagram: IG User
  • Threads: Threads User
  • WhatsApp: Phone number (as identity)

Content (created by actors):

  • Facebook: Post, Photo, Video, Album, Comment, LiveVideo
  • Instagram: IG Media, IG Comment, Stories, Reels
  • Threads: Threads Post
  • WhatsApp: Message (text, media, contact, location, interactive, template)

Containers:

  • Facebook: Group, Event, Album, Page
  • Instagram: IG Container (publishing workflow)

Auxiliary:

  • Facebook: Place, Location, Reaction, Check-in (deprecated)
  • Instagram: IG Hashtag

Cross-Product:

  • Accounts Center (identity linkage)
CategoryFacebookInstagramThreadsWhatsApp
IdentityUser, PageIG UserThreads UserPhone/WAID
ContentPost, Photo, Video, LiveVideoIG MediaThreads PostMessage
EngagementComment, ReactionIG CommentReplyRead receipt
ContainerAlbum, Group, EventStories, Carousel-Conversation
LocationPlace, Location--Location message
Discovery-IG Hashtag--
MetaApplicationIG Container-Template

Universal fields across all entities:

  • id — Unique identifier (format varies by product)
  • created_time / timestamp — Creation timestamp
  • Permissions/privacy controls

Actor-specific fields:

  • Name/username
  • Profile picture
  • Bio/about
  • Verification status
  • Follower/friend counts

Content-specific fields:

  • Text/message/caption
  • Media URL(s)
  • Author/from/owner
  • Engagement counts (likes, comments, shares)
  • Permalink

Container-specific fields:

  • Name/title
  • Description
  • Member/item count
  • Privacy/visibility
  • Cover image

Based on Facebook’s patterns, consider these entity categories:

Our TypeInspired ByKey Properties
personFB User, IG User, profilename, username, avatar, bio
organizationFB Pagename, category, description, website
postFB Post, IG Media, Threads Postcontent, author, timestamp, media
commentFB Comment, IG Commentcontent, author, timestamp, parent
mediaFB Photo, FB Videotype, url, dimensions, caption
collectionFB Album, FB Groupname, description, items
eventFB Eventname, start, end, location, host
placeFB Place, Locationname, coordinates, address
hashtagIG Hashtagname

Edge TypeDirectionBetweenProperties
friendBidirectionalUser ↔ Usercreated_time
followUnidirectionalUser → User/Pagecreated_time
member_ofUnidirectionalUser → Grouprole (admin/moderator/member), joined_time
attendingUnidirectionalUser → Eventrsvp_status (attending/maybe/declined)
invited_toUnidirectionalUser → Eventinvited_by
admin_ofUnidirectionalUser → Page/Grouprole type
blockedUnidirectionalUser → Usercreated_time

Family Relationships (Deprecated but informative)

Section titled “Family Relationships (Deprecated but informative)”
Edge TypeInverse
motherson/daughter
fatherson/daughter
brotherbrother/sister
sisterbrother/sister
grandfathergrandson/granddaughter
grandmothergrandson/granddaughter
unclenephew/niece
auntnephew/niece
cousincousin
StatusConfirmation RequiredPartner Field
SingleNo-
In a relationshipYessignificant_other
EngagedYessignificant_other
MarriedYessignificant_other
In a civil unionYessignificant_other
In a domestic partnershipYessignificant_other
It’s complicatedNooptional
In an open relationshipYessignificant_other
SeparatedNo-
DivorcedNo-
WidowedNo-
Edge TypeDirectionBetweenProperties
author_ofUnidirectionalUser/Page → Content-
comment_onUnidirectionalComment → Content-
reply_toUnidirectionalComment → Comment-
in_albumUnidirectionalPhoto/Video → Album-
posted_toUnidirectionalPost → User/Page/Group-
sharedUnidirectionalPost → Post (original)share_time
mentionsUnidirectionalContent → User-
Edge TypeDirectionBetweenProperties
likedUnidirectionalUser → Contentcreated_time
reactedUnidirectionalUser → Contentreaction_type, created_time
tagged_inUnidirectionalContent → Userx, y (for photos), created_time
savedUnidirectionalUser → Contentcreated_time, collection
Edge TypeDirectionBetweenProperties
located_atUnidirectionalPage/Event → Place-
checked_inUnidirectionalUser → Placetimestamp, message (deprecated)
tagged_locationUnidirectionalContent → Place-
Edge TypeDirectionBetweenProperties
uses_appUnidirectionalUser → Applicationinstalled_time
managesUnidirectionalUser → Pagerole
linked_accountBidirectionalAccount ↔ Accountplatform

Facebook edges carry: association type, timestamp, optional data. This enables queries like “friends added in 2023” or “posts liked this week.”

  1. Single association per type: Two objects can have at most ONE association of the same type
  2. Timestamp required: Every association has a creation timestamp
  3. Bidirectional = two associations: Friend relationships create edges in BOTH directions
  4. Inverse types for bidirectional: Uses different type IDs for each direction
  5. Optional data payload: Associations can carry key-value data (e.g., family type name)
PatternExampleImplementation
One-to-Onesignificant_otherMutual confirmation required
One-to-Manyauthor → postsSingle direction
Many-to-ManyfriendsBidirectional edges
Self-referentialUser → User (friend)Same type on both ends
PolymorphicUser → (Post|Photo|Video)Target can be multiple types
Section titled “Recommended Relationship Types for Our Schema”

Based on Facebook’s patterns, consider these relationship categories:

CategoryRelationships
Socialknows, follows, friends_with, blocked
Familyparent_of, child_of, sibling_of, spouse_of, relative_of
Professionalworks_at, colleague_of, manages, reports_to
Groupmember_of, admin_of, moderator_of
Eventattending, hosting, invited_to
Contentauthor_of, commented_on, replied_to, shared, mentioned_in
Engagementliked, reacted_to, saved, tagged_in
Locationlocated_at, lives_in, born_in, visited
Ownershipowns, created, manages

  • Created research doc
  • Outlined key research areas
  • Added key people section (Lars Rasmussen, Tom Stocky, Bret Taylor)
  • Next: Subagent deep-dives on Open Graph Protocol and Graph API
  • TAO architecture: 1B reads/sec, 64-bit OIDs, typed associations
  • Graph API entities: User, Page, Post, Photo, Video, Album, Comment, Group, Event, Place
  • Graph Search history: 2013-2019, Lars Rasmussen/Tom Stocky
  • “Anatomy” paper: 721M users, 68.7B friendships, 4.7 avg distance
  • Platform evolution: 2007 Platform → 2010 Open Graph → 2018 Cambridge Analytica
  • 40+ TAO/Unicorn paper authors documented

2026-01-24: Phase 2 - Relationship Deep-Dive

Section titled “2026-01-24: Phase 2 - Relationship Deep-Dive”
  • Comprehensive relationship type taxonomy (romantic, family, follow)
  • TAO association model details (typed edges, timestamps, bidirectional handling)
  • Privacy model for relationships (audience selector, mutual confirmation)
  • API evolution (v3.2 deprecations, Cambridge Analytica impact)
  • Connection strength algorithms (dispersion metric)

2026-01-24: Comprehensive Entity Schema Research

Section titled “2026-01-24: Comprehensive Entity Schema Research”

Open Graph Protocol Complete:

  • Full type system documented: music (song, album, playlist, radio_station), video (movie, episode, tv_show, other), article, book, profile, website, payment.link
  • All properties per type with data types
  • Namespace structure (vertical-specific URIs)

Facebook Graph API v24.0 Entity Schemas:

  • Complete field documentation for: User, Page, Post, Photo, Video, Album, Group, Event, Place, Comment
  • All edge types documented with properties
  • Location object schema with GPS coordinates

Instagram Graph API Entity Types:

  • IG User fields: id, username, biography, followers_count, media_count, etc.
  • IG Media fields: media_type, caption, timestamp, comments_count, like_count, children
  • IG Comment fields: text, timestamp, from, like_count
  • IG Hashtag: id, name with recent_media edge
  • IG Container: Publishing workflow entity with status tracking

Threads API Entity Types:

  • Threads User: id, username, name, threads_profile_picture_url, threads_biography, is_verified
  • Threads Post: media_type (TEXT_POST, IMAGE, VIDEO, CAROUSEL_ALBUM, AUDIO, REPOST_FACADE), text, permalink, is_quote_post

WhatsApp Business API Entity Types:

  • Message entity with WAMID identifier
  • Message types: text, image, video, audio, document, sticker, contacts, location, interactive, template
  • Status tracking: sent, delivered, read, failed, deleted

Cross-Platform Comparison:

  • Twitter/X API v2 entity types: Post, User, Space, List, Media, Poll, Place
  • Google People API: Person resource with names, emails, phones, addresses, relations
  • Documented differences in ID formats, relationship models, privacy approaches

Meta Cross-Product Integration:

  • Accounts Center for unified identity
  • Cross-posting capabilities (WhatsApp Status → Stories)
  • Profile sync across Facebook, Instagram, Threads
  • Product-specific ID namespaces

Entity Type Implications Updated:

  • Complete taxonomy: Actors, Content, Containers, Auxiliary, Cross-Product
  • Property summaries by category
  • Recommended entity types for our schema

Relationship Implications Updated:

  • Complete edge taxonomy: Social, Family, Romantic, Content, Engagement, Location, Platform
  • TAO association rules (single per type, timestamps, bidirectional handling)
  • Cardinality patterns (one-to-one, one-to-many, many-to-many, polymorphic)
  • Recommended relationship types for our schema

This section focuses specifically on how Facebook models relationships between entities — the edges in their social graph.

Facebook’s relationship model reveals key design decisions:

  1. Relationships are first-class objects with their own properties (timestamp, type, metadata)
  2. Mutual vs unidirectional is an explicit design choice per relationship type
  3. Privacy is per-relationship, not just per-entity
  4. Relationships evolve over time — status changes, metadata additions, API restrictions

The relationship_status field on User supports these values:

StatusNotes
SingleDefault/unspecified
In a relationshipRequires partner confirmation
EngagedRequires partner confirmation
MarriedRequires partner confirmation
In a civil unionAdded ~2011
In a domestic partnershipAdded ~2011
It’s complicatedClassic Facebook ambiguity
In an open relationship
Separated
DivorcedStatus change doesn’t appear in Feed
WidowedAdded September 2009

Key behaviors:

  • Partner must be a Facebook friend
  • Both parties must confirm before relationship appears publicly
  • Anniversary date can be added (day/month/year)
  • Changing to Single/Divorced/Widowed is silent (no Feed story)
  • Each person controls visibility independently via audience selector

Historical note: Zuckerberg conceived relationship status to track “whether you’re having sex or aren’t you” — originally a social discovery feature for college students.

The /user/family endpoint (deprecated after v3.2) returned family members with relationship types:

Immediate Family:

TypeInverse
MotherSon/Daughter
FatherSon/Daughter
SonMother/Father
DaughterMother/Father
BrotherBrother/Sister
SisterBrother/Sister

Extended Family:

TypeInverse
GrandfatherGrandson/Granddaughter
GrandmotherGrandson/Granddaughter
GrandsonGrandfather/Grandmother
GranddaughterGrandfather/Grandmother
UncleNiece/Nephew
AuntNiece/Nephew
NephewUncle/Aunt
NieceUncle/Aunt
Cousin (male)Cousin
Cousin (female)Cousin

Implementation: Family relationships are stored with a relationship field containing the text description. Required the user_relationships permission.

The core social relationship in Facebook — bidirectional by design.

Characteristics:

  • Requires mutual acceptance (A sends request → B accepts)
  • Creates edges in both directions in TAO
  • 5,000 friend limit per user
  • /user/friends endpoint only returns friends who also use the requesting app

Termination:

  • Either party can unfriend (removes both edges)
  • No notification sent to unfriended person
  • “Take a Break” feature as softer alternative to unfriending
  • Blocking is separate from unfriending (prevents all interaction)

Introduced September 2011 as “Subscribe”, renamed to “Follow” December 2012.

Design:

  • One-way relationship (A follows B, B doesn’t need to follow A)
  • No acceptance required
  • Only applies to public updates
  • Four possible states between two users:
    1. Neither follows the other
    2. A follows B (not mutual)
    3. B follows A (not mutual)
    4. Mutual follows

Evolution: Facebook was historically symmetric (friend or nothing). Follow was added to compete with Twitter’s asymmetric model and enable following public figures without the social contract of “friending.”

Edge type: User → Group (member_of)

Properties:

  • Role: member, admin, moderator
  • Joined timestamp
  • Approved by (for closed/private groups)

Access: Groups API requires specific feature enablement post-2018.

Likes (user → page):

  • Asymmetric (page doesn’t “like back”)
  • /user/likes edge returns liked pages
  • Includes created_time (when user liked)
  • Music, books, movies, sports teams are special page-like types

Admin/Manager (user → page):

  • /user/accounts edge for pages where user has a role
  • Multiple role types (admin, editor, moderator, advertiser, analyst)

Edge types:

  • attending (confirmed)
  • maybe (tentative)
  • declined
  • invited (hasn’t responded)

Properties:

  • RSVP timestamp
  • Invited by (which user sent the invite)

Access: Event attendance endpoints restricted to Facebook Marketing Partners for Users/Pages; Groups require admin token.

Edge type: Entity → User (tagged_in)

Appears on:

  • Photos
  • Posts
  • Videos
  • Check-ins (deprecated)

Behavior:

  • Creates notification
  • Subject can remove tag
  • Privacy: tag visibility follows the content’s privacy

Facebook’s TAO system stores relationships as typed directed edges called associations.

Association structure:

(source_id, association_type, destination_id, timestamp, data)

Key design decisions:

  1. At most one association per type between two objects

    • You can’t “like” something twice
    • Different types can coexist (like + comment on same post)
  2. Timestamps are required

    • Enables “association lists” ordered by recency
    • Supports queries like “most recent comments” or “friends added this year”
  3. Bidirectional relationships use inverse types

    • Friend relationship = two associations with inverse types
    • If A friends B: (A, friend, B) AND (B, friend, A)
    • Enables efficient queries from either direction
  4. No restrictions on type connections

    • Any association type can theoretically connect any node types
    • Schema flexibility over strict validation
  5. Optional data payload

    • Associations can carry additional key-value data
    • Example: family relationship stores the relationship name (“mother”, “uncle”)

Every relationship has temporal data:

RelationshipTimestamp Meaning
FriendWhen friendship was confirmed
FollowWhen follow started
LikeWhen page/content was liked
Group memberWhen user joined
Event attendingWhen RSVP was made
TaggedWhen tag was created

For romantic relationships, users can specify:

  • Anniversary date (day, month, year)
  • Displayed on profile similar to birthday
  • Friends receive anniversary reminders
  • Added December 2009

Facebook calculates relationship strength using:

  1. Mutual friends — Primary signal

    • 100+ mutual friends = 90%+ chance of knowing in real life
    • 1 mutual friend = ~50% chance
    • Users 42% more likely to accept requests from high-mutual-friend users
  2. Profile overlap

    • Shared hometown, current city, schools, workplaces
  3. Interaction patterns

    • Likes, comments, tags, wall posts
    • Two-way interactions 30% more predictive than passive engagement
  4. Dispersion metric (research)

    • Measures whether mutual friends are themselves connected
    • High dispersion = stronger tie (romantic partners have dispersed networks)
    • Used to identify closest relationships in neighborhood

Relationship visibility controlled via standard Facebook audience options:

  • Public — Anyone can see
  • Friends — Only friends
  • Friends except… — Exclude specific people
  • Specific friends — Allowlist
  • Only me — Hidden

Each person controls their own relationship visibility:

  • A can show “In a relationship with B” publicly
  • B can set the same relationship to “Only me”
  • No requirement for matching privacy settings

Certain relationships require both parties to confirm:

  • Romantic relationships (In a relationship, Engaged, Married, etc.)
  • Family relationships

Until confirmed by both, relationship doesn’t appear on either profile.

Some status transitions don’t create Feed stories:

  • Changing to “Single”
  • Changing to “Divorced”
  • Removing relationship status entirely

This is intentional — Facebook recognizes relationship endings are sensitive.


  • /user/friends — Full friend list
  • /user/family — Family relationships with types
  • Apps could access friends of friends
  • Extensive social graph data available to developers
  • 87 million users’ data harvested via friends-of-friends access
  • Facebook restricted API access dramatically
EndpointStatus
/user/friendsOnly returns friends who use the app
/user/familyRemoved entirely
/user/relationship_statusReturns no data
/user/groupsRequires approved use case

Relationship data is largely inaccessible via API:

  • Friend lists only return app-using friends
  • Family relationships unavailable
  • Relationship status field returns no data
  • Most social edges require specific permissions and app review

Beyond explicit user-declared relationships, Facebook infers connections from:

  • Frequent message exchanges
  • Regular profile views
  • Comment/like patterns
  • Photo tag frequency
  • Check-in co-occurrence
  • Location data overlap
  • Event co-attendance
  • Uploaded phone contacts
  • Email contacts
  • “People You May Know” derived connections
  • Same-organization membership (Workplace)
  • Game/app co-usage
  • Group co-membership

  1. Separate relationship types from relationship instances

    • “friend” is a type; “Alice friends Bob” is an instance
    • Types define behavior (symmetric vs asymmetric, confirmation required, etc.)
  2. Timestamps on all relationships

    • Enables temporal queries and ordering
    • Required for “since” semantics
  3. Metadata varies by relationship type

    • Romantic: anniversary date
    • Family: relationship name
    • Event: RSVP status
    • Consider type-specific schemas
  4. Privacy is per-relationship, not per-entity

    • Entity visibility and relationship visibility are independent
    • Both parties in a relationship may have different privacy settings
  5. Bidirectional ≠ Symmetric

    • Bidirectional = edges in both directions (friend)
    • Symmetric = same relationship type both ways
    • Can have bidirectional asymmetric (A follows B, B follows A are independent)
  6. Relationship lifecycle matters

    • Creation, confirmation, modification, termination
    • Each state transition may have different behaviors (notifications, Feed stories)
  7. API access ≠ Data existence

    • Facebook has vastly more relationship data than they expose
    • Connection strength, inferred relationships, interaction patterns all exist internally
  8. Vertical-specific schemas are powerful

    • OGP uses namespaces: music., video., article, book, profile
    • Each vertical has domain-specific properties
    • Base properties apply to all, vertical properties extend
  9. Entity IDs should be product-agnostic

    • Each Meta product uses its own ID space
    • Cross-product identity is a separate concern (Accounts Center)
    • Don’t couple entity IDs to a single platform
  10. Content types are hierarchical

    • Base type (Post/Media) with specific subtypes (Photo, Video, Reel, Story)
    • media_type and media_product_type as discriminators
    • Enables polymorphic queries while maintaining type safety
  11. Engagement is first-class

    • Reactions are typed (LIKE, LOVE, HAHA, etc.) not just counts
    • Each engagement is a relationship with timestamp
    • Enables queries like “things I liked this week”
  12. Containers vs Content

    • Album contains Photos, Group contains Posts, Event has Attendees
    • Container relationships: contains, member_of, posted_to
    • Containers have counts, privacy, membership rules
  13. Publishing workflows

    • IG Container pattern: create container → upload media → publish
    • Separates intent (container) from final content (published media)
    • Enables status tracking: IN_PROGRESS, ERROR, FINISHED, PUBLISHED
  14. Edge pagination is essential

    • All collection edges use cursor-based pagination
    • Total counts are expensive (only available with summary=true)
    • Optimize for “most recent N” not “all”