Cypher projections work by first identifying the set of nodes you want to use (first clause), and then defining the relationships you want to consider (second clause). So you can use the projection to subset or filter your input graph.
In order to just consider person nodes for your closeness centrality calculation, you'll want to create a monopartite person to person projection. For example, something like:
CALL algo.closeness.stream(
'MATCH (p:PERSON) RETURN id(p) as id',
'MATCH (p1:Person)-[r]-(p2:Person) RETURN id(p1) as source, id(p2) as target',
{graph:'cypher'})
YIELD nodeId, centrality
(if you don't have one hop relationships between people, you may need something like MATCH (p1:Person)-->()<--(p2:Person)
in your second query, or you could use similarity to create new person to person relationships as @ganesanmithun323 suggested).
I'm not sure what you mean by
I want the algorithm to find shortest paths in my graph induced by the "PERSON", "CITATION" and "BIOTERM" nodes, but computes the centrality measure only for the "PERSON" nodes.
Since closeness centrality uses shortest paths in the calculation, I suspect what you're really looking for is to calculate closeness centrality across all paths, but only return the results for person nodes? In which case, you can limit that in the post processing with your YIELD/RETURN.
My recommendation would be to start by defining what exactly you want to use to calculate your closeness centrality score, then modify your data model accordingly to represent that.