Hi Denny - Correct - URI opaqueness is required at the level of exchange but there's no such requirement internal to an application. During exchange, sure you can add a triple to assert that Density is the type of the object France#Density:2012_pop_estimate_Bilan_2010. Outside of exchange, type can be reported by an API or template which parses the namespace from the object's name. Obviously this would save one triple per object and per page, in the triples database - a big win in large datasets such as WP.
A similar situation is found today in SMW applications. People create namespaces and then add a category of the *same name* to the pages and objects in that namespace; it's highly inefficient and makes me yelp !!
Denny asks: How do I know the relationship between France#Density:2012_pop_estimate_Bilan_2010 and Germany#Density:2009_pop_estimate_CIA_2010?
If you're asking how do you know they're both Density objects. That's easy - they're subobjects in the same 'namespace'. So in SMW speak, I'd like to use a predicate 'like' operator. To list all Density subobjects is just [[~#Density:+]] To list all for a page is just [[~France#Density:+]] To list all for both is [[~France#Density:+||~Germany#Density:+]]
With regard to rdf:property - I think you may have meant rdf:predicate as there's no rdf:property I could find. It's domain is an rdf:Statement not rdf:Resource. Is a Snak a subtype of rdf:Statement? Why not name it as such, eg "WMFStatement", to clearly assert its lineage? In any event, I'm concerned about using rdf:predicate in this manner. In fact I suspect there's some confusion about reification, because I used dc:Subject / dc:subject to associate the 'reifier' with the object I think in a quite traditional uncontroversial manner. To use rdf mechanisms for reification in this context I'm worried could be particularly problematic.
john PS yes I was giving triples!!!!