I cannot answer for research in logic about blank but I can try to explain blank nodes. In my (possibly faulty) comprehension of the W3C standard, blank nodes are "existential variables" in the logical sense quantified at the "dataset" level (i.e. a collection of RDF graphs). The underlying idea behind blank nodes is to acknowledge that something exists but we don't know its exact value and this blank node can be shared among different triples.
For instance if you have a dataset saying that Alice and Bob are brother and sister (e.g. with a shared parent) you can say something like
ex:Alice ex:hasParent _:a .
ex:Bob ex:hasParent _:a .
ex:Charles ex:hasParent _:b .
Here we can talk about the common parent of Alice and Bob but you know that Charles has a parent that might be different (it might be that :b=:a) we just don't know exactly who it is. In comparison if you just say "unknown" instead you loose the information about the fact that Alice and Bob share a parent who is unknown. In logical form, with predicates, you can say the same thing with:
$$\exists a,b ~~ \text{hasParent}(\text{Alice},a) \land \text{hasParent}(\text{Bob},a) \land \text{hasParent}(\text{Charles},b)$$
Hope this helps!
_
is used for "gensyming", i.e., generation of unique identifiers that cannot be referred to. Suppose you replace all the_
withfoo$1
,foo$2
,foo$3
, ... in order of appearance. Then we have the same effect, don't we? (Assuming$
is not a valid character in an identifier.) $\endgroup$