| title | GQL Schema Example - Social Network |
|---|---|
| description | Review the complete GQL schema definition for the social network domain used throughout graph in Microsoft Fabric documentation examples. |
| ms.topic | reference |
| ms.date | 03/12/2026 |
| ms.reviewer | splantikow |
[!INCLUDE feature-preview]
This article provides the complete technical specification for the social network graph type used throughout the GQL documentation. This schema demonstrates many common features of complex graphs and serves as the foundation for all query examples in the GQL language documentation.
Note
The social network example is derived from the LDBC SNB (LDBC Social Network Benchmark) published by the GDC (Graph Data Council).
For more information, see the article "The LDBC Social Network Benchmark". For information on how to obtain a copy of the derived dataset, see social network example graph dataset.
:::image type="content" source="./media/gql/schema-example.png" alt-text="Diagram showing the social network schema." lightbox="./media/gql/schema-example.png":::
The social network domain models a comprehensive social platform with the following entities:
- People with demographic and behavioral properties
- Organizations including educational institutions (universities) and employers (companies)
- Geographic hierarchy from cities through countries/regions to continents
- Content system with forums, posts, and threaded comments
- Taxonomy system with tags and tag classifications
- Social and professional relationships between people and organizations
For a more detailed introduction to the entities of this domain, see GQL language guide.
This graph type showcases advanced GQL capabilities:
- Node type inheritance using abstract base types (
Message,Organization,Place) - Multiple inheritance patterns with shared property definitions
- Edge type families where the same relationship label connects different node type combinations
- Comprehensive constraint system ensuring data integrity through key constraints
- Mixed relationship patterns including hierarchical containment, social connections, and content interactions
The following graph type provides a complete schema definition in GQL syntax:
(:TagClass => { id :: UINT64 NOT NULL, name :: STRING, url :: STRING }),
CONSTRAINT tag_class_pk
FOR (n:TagClass) REQUIRE (n.id) IS KEY,
(:TagClass)-[:isSubclassOf]->(:TagClass),
(:Tag => { id :: UINT64 NOT NULL, name :: STRING, url :: STRING }),
(:Tag)-[:hasType]->(:TagClass),
CONSTRAINT tag_pk
FOR (n:Tag) REQUIRE (n.id) IS KEY,
ABSTRACT
(:Place => { id :: UINT64 NOT NULL, name :: STRING, url :: STRING }),
(:City => :Place),
(:Country => :Place),
(:Continent => :Place),
CONSTRAINT place_pk
FOR (n:Place) REQUIRE (n.id) IS KEY,
(:City)-[:isPartOf]->(:Country),
(:Country)-[:isPartOf]->(:Continent),
ABSTRACT
(:Organization => { id :: UINT64 NOT NULL, name :: STRING, url :: STRING }),
(:University => :Organization),
(:Company => :Organization),
CONSTRAINT organization_pk
FOR (n:Organization) REQUIRE (n.id) IS KEY,
(:University)-[:isLocatedIn]->(:City),
(:Company)-[:isLocatedIn]->(:Country),
(:Person => {
id :: UINT64 NOT NULL,
creationDate :: ZONED DATETIME,
firstName :: STRING,
lastName :: STRING,
gender :: STRING,
birthday :: UINT64,
browserUsed :: STRING,
locationIP :: STRING
}),
CONSTRAINT person_pk
FOR (n:Person) REQUIRE (n.id) IS KEY,
(:Person)-[:hasInterest]->(:Tag),
(:Person)-[:isLocatedIn]->(:City),
(:Person)-[:studyAt { classYear :: UINT64 }]->(:University),
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company),
(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person),
(:Forum => {
id :: UINT64 NOT NULL,
creationDate :: ZONED DATETIME,
title :: STRING
}),
CONSTRAINT forum_pk
FOR (n:Forum) REQUIRE (n.id) IS KEY,
(:Forum)-[:hasTag]->(:Tag),
(:Forum)-[:hasMember { creationDate :: ZONED DATETIME, joinDate :: UINT64 }]->(:Person),
(:Forum)-[:hasModerator]->(:Person),
ABSTRACT (:Message => {
id :: UINT64 NOT NULL,
creationDate :: ZONED DATETIME,
browserUsed :: STRING,
locationIP :: STRING,
content :: STRING,
length :: UINT64
}),
CONSTRAINT message_pk
FOR (n:Message) REQUIRE (n.id) IS KEY,
(:Post => :Message += {
language :: STRING,
imageFile :: STRING
}),
(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(:Post),
(:Post)-[:hasCreator]->(:Person),
(:Post)-[:isLocatedIn]->(:Country),
(:Forum)-[:containerOf]->(:Post),
(:Comment => :Message),
(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(:Comment),
(:Comment)-[:hasCreator]->(:Person),
(:Comment)-[:isLocatedIn]->(:Country),
(:Comment)-[:replyOf]->(<:Message),
(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(<:Message),
(<:Message)-[:hasCreator]->(:Person),
(<:Message)-[:isLocatedIn]->(:Country),
(<:Message)-[:hasTag]->(:Tag)The schema defines three inheritance hierarchies:
Geographic hierarchy:
Place(abstract) →City,Country,Continent
Organizational hierarchy:
Organization(abstract) →University,Company
Content hierarchy:
Message(abstract) →Post,Comment
Several edge labels form type families connecting different node combinations:
Location relationships (isPartOf):
- Cities belong to countries/regions:
(:City)-[:isPartOf]->(:Country) - Countries/regions belong to continents:
(:Country)-[:isPartOf]->(:Continent)
Content interactions (likes):
- People like posts:
(:Person)-[:likes]->(:Post) - People like comments:
(:Person)-[:likes]->(:Comment) - People like messages:
(:Person)-[:likes]->(<:Message)
Geographic location (isLocatedIn):
- People live in cities:
(:Person)-[:isLocatedIn]->(:City) - Universities located in cities:
(:University)-[:isLocatedIn]->(:City) - Companies located in countries/regions:
(:Company)-[:isLocatedIn]->(:Country) - Posts located in countries/regions:
(:Post)-[:isLocatedIn]->(:Country) - Comments located in countries/regions:
(:Comment)-[:isLocatedIn]->(:Country)
Every node type has a corresponding key constraint ensuring unique identification by id property:
tag_class_pk,tag_pk,place_pk,organization_pk,person_pk,forum_pk,message_pk