How to deal with a person that may have multiple alias names?
Option 2 is the right way for graph databases, especially if :Alias nodes all point to the :Person node (or whatever label you use to differentiate a person entry from an alias) who has that alias. The :Person node itself can also have an :Alias label, allowing their name property to also be considered when performing queries.

For example, if you had a graph like this:

(:Alias {name:'Joe Shmoe'})-[:ALIAS_FOR]-&gt;(joe:Person:Alias {name:'Joe Jackson'})
(:Alias {name:'Joe Anybody'})-[:ALIAS_FOR]-&gt;(joe)
(:Alias {name:'Joseph Jones'})-[:ALIAS_FOR]-&gt;(joe)


Then you could issue a query with an $alias parameter like:

MATCH (:Alias {name:$alias})-[:ALIAS_FOR*0..1]-&gt;(person:Person)
RETURN person


You should have an index on :Alias(name) for quick lookup, this allows lookup of the person for their name or any alias associated with them (remember their :Person node is also an :Alias node, so this will match too).

And if you need to do case insensitive searches, or searches across multiple fields, then you may want to look at leveraging fulltext schema indexes introduced in Neo4j 3.5.x