Theory
rdfs:subClassOf says every instance of A is also an instance of B.
:Ninja rdfs:subClassOf :Person .
:Donatello a :Ninja .
RDFS entailment lets a reasoner conclude :Donatello a :Person . without you stating it. Inference is free triples.
Crucial mindset shift: RDFS is entailment, not constraint. Declaring :Ninja rdfs:subClassOf :Person does not reject data — it adds new triples (:Donatello a :Person .) on top of what you stated. If you want to reject invalid data, that's SHACL's job (Level 6). RDFS makes your graph bigger; SHACL keeps it honest.