This is because you have duplicates in the _TPL table. Internally, to maintain the set semantics of an RDF graph (or an RDF dataset), we take out duplicates (triples/quads). That's why RDF_LINK$ (or the RDFM_ views of RDF_LINK$ partitions) may have less number of rows.

We do maintain a COST column in MDSYS.RDF_LINK$ to keep track of how many duplicates there are for each unique triple/quad.

Let me explain. MDSYS.RDF_LINK$ is the underlying table storing all triples/quads that exist in the semantic network. It is partitioned so that each separate RDF model (asserted or inferred) can occupy a separate partition.

MDSYS.RDF_LINK$ itself is a private table in MDSYS. Regular users are NOT able to access it. Views (like MDSYS.RDFM_<model_name>) can be created on top of one or multiple partitions. Access to the views can be granted to regular users.

You are right when there is no duplicates, # of rows in _TPL should match that in MDSYS.RDFM_<model_name>