Ravi Chandu Edru/ learn
Ontology & Fabric IQ

The Graph

Labeled property graph

You have a graph now. But there are two ways to store the very same fact, and only one is what Fabric runs on. This is the shape under your ontology.

7 min read

Your graph was built in the last concept, and it felt like the finish line. It is not. Saying "a graph" is not enough. There is more than one way to store the exact same fact, and the ways are not the same. Pick the wrong one and a whole set of questions gets hard to ask.

Take one small fact: freezer F-02 is a freezer, its warmest safe temperature is minus eighteen, and it cools shipment SH-9 since 2024. It is a simple fact. Now store it.

One way breaks that fact into a small pile of three-word statements. F-02 is a Freezer. F-02 has maxTempC minus eighteen. F-02 cools SH-9. Each statement is true. But none of them, on its own, is the freezer. You rebuild the thing by collecting its statements. That is roughly how RDF works: subject, then predicate, then object. It is triples, and only triples.

The other way keeps the freezer as one object that already knows what it is and what is true about it. That is the shape Fabric uses, and it has a name.

The universal idea · true in any system

The same fact, two shapes

Here they are, side by side. On the left the freezer is a pile of triples. On the right it is one labeled node. Both hold the same information. They do not hold it the same way, and the difference matters.

RDF · TRIPLESsubject · predicate · objectF-02aFreezerF-02maxTempC-18F-02statusokthree rows, one thing hiding among themLPG · ONE NODElabel + property bag, together:Freezerid : "F-02"maxTempC : -18status : "ok"one node that already is a Freezer
Figure 1One fact about one freezer, stored two ways. On the left it is three separate triples, subject-predicate-object, that only add up to a thing once you gather them. On the right it is one labeled node that already knows what it is and what is true about it.

In the triple pile, "Freezer" is just one more statement next to the others. The type of the thing and the facts about the thing are the same kind of row. That is neat, but it also means there is no single place that is the freezer. In the labeled node, the type is marked on the object itself, and the properties live inside it. You do not gather the freezer. You point at it.

Neither shape is wrong. RDF's triples are the base of the semantic web, and they fit together well across the open internet. But for a business graph that you own and query a lot, the labeled property graph tends to win on one thing: it puts a thing's type and a thing's facts in one place. So both the human and the query engine can grab them together.

A node is a label plus a bag. So is an edge.

The shape has two parts, and the neat part is that both parts repeat. A node is a label plus a property bag. An edge is a label plus a property bag too. The relationship is not a thin, nameless line between two things. It is its own thing, with a type and its own facts.

:Freezerid : "F-02"maxTempC : -18status : "ok":Shipmentid : "SH-9"status : "in transit"[:COOLS]since : "2024"a node = label + propertiesan edge = label + properties
Figure 2The shape has two parts and both parts repeat. A node is a label plus a bag of properties. An edge is a label plus a bag of properties too. The relationship is not a thin line between things: it is a thing itself, with a type and its own facts.

Look at the edge. [:COOLS {since: "2024"}]. That since does not belong to the freezer, and it does not belong to the shipment. It belongs to the link itself, to the cooling. In a labeled property graph the edge has a place to keep it. This is exactly the property-on-a-relationship idea from earlier, now shown in the storage shape that makes it natural.

That is also where RDF has to work harder. A plain triple can say F-02 cools SH-9, but a triple has three slots and they are all full, so there is no place to put since. To add one property to that relationship, you make a stand-in node and spend several triples describing it. The property graph gives the edge a label and a bag from the start, so the fact just goes in.

Click around and try it yourself. Pick the freezer, pick the edge, then switch how it gets stored.

Inspect the graph

Click a node or the edge between them, then flip the view. Watch what it takes to hold the very same fact each way.

Inspect
COOLSF-02:FreezerSH-9:Shipment
Store it as
:Freezerone node
id"F-02"
maxTempC-18
status"ok"

Label plus a bag of properties, in one place. A query can name the type and read a property together.

Notice what happened when you inspected the edge in RDF. One relationship with one small property turned into a blank node and four statements. Same fact, more parts. That is the cost you pay when the model has no first-class place for an edge's own properties.

Check yourself

A hospital graph has a Doctor node and a Patient node, joined by a TREATED edge that needs to record the date of treatment and the outcome. Where do the date and the outcome belong?

In Microsoft Fabric IQ · how it shows up

What Fabric stores under your ontology

The graph under a Fabric IQ ontology is a labeled property graph. This is not a detail you set up. It is the model, the same shape used by common graph databases, and it is why everything you built in the earlier concepts fits so well.

The mapping is direct. Each entity instance becomes a labeled node: the entity type is the label, and the properties you declared become the node's property bag. Each relationship instance becomes a labeled edge: the relationship type is the label, and any attributes on the relationship become the edge's property bag. Nodes and edges both carry properties, and both carry lineage, a link back to the row they came from.

YOUR DATATHE GRAPHa Freezer row in OneLake(:Freezer { … })NODEa Shipment row in OneLake(:Shipment { … })NODEa cooled-by link[:COOLS { since }]EDGEbuilt over your OneLake tables in place, queried in GQL
Figure 3In Fabric IQ the mapping is direct. Each entity instance from your OneLake tables becomes a labeled node. Each relationship instance becomes a labeled edge. Both carry their properties, so a query can name a type and read a property in the same breath.

Because the type and the properties sit together, a query can ask for them together. That is why the graph in Microsoft Fabric answers questions in GQL, the ISO-standard graph query language, where a pattern names a label and reads a property in one clause. A data agent, which is Fabric's name for an AI agent grounded in your data, walks these labeled edges and reads these property bags to reason over the knowledge graph. That is the GraphRAG loop you have been building toward. All of it runs over your OneLake tables in place, with no separate graph database. Microsoft is very firm on this point: the graph in Fabric supports the LPG model only, and RDF is not supported. So the shape on this page is not one option among several. It is the shape. As of July 2026 the graph engine itself is generally available, while the ontology item above it is still in preview, so treat that upper layer as still changing.

The takeaway · carry this into every model

The one trap

Do not treat the relationship as a nameless wire. The most common mistake coming from tables is to think of an edge as just "these two ids match", a thin link with nothing to add. In a labeled property graph the edge is first-class: it has a type and it has its own facts. When a property describes the link and not either end, like when a treatment happened or since when a freezer has cooled a shipment, that property lives on the edge. Put it on a node and you have quietly put the fact in the wrong place.

So the graph stores nodes and edges, labels and properties. But there is a deeper split inside those edges. Some of them you stated directly from your data, and some of them the graph worked out for you. Next: asserted versus derived, the difference between a fact you loaded and a fact the graph figured out.

Do it yourself

Build this step in the interactive Ontology Lab.

Open the lab →

Fabric IQ is in preview; details checked 2026-07-15 and may change.

Milestone

Finished this concept? Mark it learned to track your progress.

Saved in this browser.