Logic for Manipulation in List
MATCH (n:Person)
with collect( distinct n) as names
with [name in names where name.name=~'B' or name.name=~'A'] as name
return name
When you have a node with a list property, you can use list predicate functions to test if any, all, or none of the elements of the list meet a predicate.
So in your case, something like this may work:
MATCH (n:Person)
WHERE any(name in n.name WHERE name =~ '(?i)AND.*')
RETURN n.name, n.age
Note that this approach will not leverage indexes. If you do need to leverage indexes like this, you may have to consider restructuring your data model with new kinds of nodes, such as :Alias nodes attached to a :Person, each one with a name (that is indexed), and have your query do an index lookup on the alias name using a lookup that will utilize the index, then MATCH to the :Person nodes for that alias.