In genealogy we use DNA to find matches. Y-DNA finds patrilineal matches. A neo4j query (where RN is a unique identifier for a person) that does this is:
MATCH (n{RN:1}) match p=n-[r:father*..22]->m return m.RN as RN,m.fullname as FullName,m.sex as Sex,m.bd as BD,m.dd as DD,length(p) as generation,case when left(m.bd,4)>'1930' and rtrim(m.dd)='' then 'Y' else 'N' end as mtDNA_Candidate, reduce(srt2 ='|', q IN nodes(p)| srt2 + q.RN + '|') AS PathOrder order by generation desc,PathOrder desc
or we use mitochondrial DNA for matrilineal matches:
`MATCH (n{RN:1}) match p=n-[r:mother*..22]->m return m.RN as RN,m.fullname as FullName,m.sex as Sex,m.bd as BD,m.dd as DD,length(p) as generation,case when left(m.bd,4)>'1930' and rtrim(m.dd)='' then 'Y' else 'N' end as mtDNA_Candidate, reduce(srt2 ='|', q IN nodes(p)| srt2 + q.RN + '|') AS PathOrder order by generation desc,PathOrder desc`
MY QUESTION is related to X-chromosome DNA. A father gives an X-chromosome to only his daughters and a mother gives one to all her children. Thus, I need a cypher query that gets all mother's but only father's when there is a daughter in the immediate more recent temporal generation. If there is a son in the later generation then I exclude the father. I have a property 'sex' in the nodes with a value of either M or F. the birth date is not always known, so it cannot be used to determine directionality
I tried this, but get an error:
`MATCH (n{RN:1}) match p=n-[r:mother*..22|father*..1]->m return m.RN as RN,m.fullname as FullName,m.sex as Sex,m.bd as BD,m.dd as DD,length(p) as generation,case when left(m.bd,4)>'1930' and rtrim(m.dd)='' then 'Y' else 'N' end as mtDNA_Candidate, reduce(srt2 ='|', q IN nodes(p)| srt2 + q.RN + '|') AS PathOrder order by generation desc,PathOrder desc`