In most of my examples I've been using a string literal to represent a person's name, like so:
<#person> gc:name "Mary Rice"
Or, on a good day, like so:
<#person>
gc:firstName "Mary" ;
gc:lastName "Rice" .
In reality, however, names can be, and, especially historically and in non-English speaking cultures, are much more complicated. I'm thinking we should take the lead from the GENTECH data model and instead use "name parts". This would be done using the RDF list construct:
<#person> gc:name [ rdf:type rdf:List ;
rdf:first "Mary" ;
rdf:rest [ rdf:type rdf:List ;
rdf:first "Flatley" ;
rdf:rest [ rdf:type rdf:List ;
rdf:first "Rice" ;
rdf:rest rdf:nil ] ] ] .
Or, to be even more explicit:
<#person> gc:name [ rdf:type rdf:List ;
rdf:first <#name-part-1> ;
rdf:rest [ rdf:type rdf:List ;
rdf:first <#name-part-2> ;
rdf:rest [ rdf:type rdf:List ;
rdf:first <#name-part-3> ;
rdf:rest rdf:nil ] ] ] .
<#name-part-1>
rdf:type gc:FirstName ;
gc:value "Mary" .
<#name-part-2>
rdf:type gc:MaidenName ;
gc:value "Flatley" .
<#name-part-3>
rdf:type gc:LastName ;
gc:value "Rice" .
There are a number of drawbacks though. First of all, this latter representation is a lot more complex than a simple string literal. It also requires an additional 15 RDF statements (which is a storage space/time problem).
Software libraries can remove a lot of this complexity though. And the storage problem can be resolved by storing lists not as a collection of RDF statements, but with an actual list data type.
I don't think we should settle on just one way to do names though. It seems to me that any of the above representations should be viable options, and that software should be able to deal with whatever comes up. That's part of the beauty of using RDF.
If we adopt name parts, though, I think we shouldn't use gc:firstName and gc:lastName. They don't have a simple mapping to gc:name.