2015-12-14 2 views
1

В генеалогии мы используем ДНК для поиска матчей. Y-ДНК находит патрилинейные спички. Neo4j запрос (где RN представляет собой уникальный идентификатор для человека), который делает это:Neo4j cypher запрос с различными отношениями по признаку пола

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

или мы используем митохондриальной ДНК для матрилинейных матчей:

`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` 

МОЙ ВОПРОС связано к ДНК Х-хромосомы. Отец дает Х-хромосому только своим дочерям, а мать дает ее всем своим детям. Таким образом, мне нужен запрос cypher, который получает все матери, но только отца, когда есть дочь в ближайшем более позднем временном поколении. Если в более позднем поколении есть сын, я исключаю отца. У меня есть свойство «секс» в узлах со значением либо M или F. дата рождения не всегда известна, поэтому он не может быть использован для определения Направленности

Я попытался это, но получает сообщение об ошибке:

`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` 
+0

Что представляет собой сообщение об ошибке? –

+0

Не могли бы вы описать свою модель данных более подробно? Что именно вы ищете с точки зрения графика? –

+0

Сообщение об ошибке с третьим запросом - это недопустимый ввод '|': ожидается символ идентификатора, карта свойств или ']' (строка 1, столбец 41 (смещение: 40)) "MATCH (n {RN: 1}) match p = n- [r: mother * .. 22 | father * .. 1] -> m return m.RN as RN, m.fullname как FullName, m.sex as Sex, m.bd as BD, m. dd как DD, длина (p) как генерация, случай, когда left (m.bd, 4)> '1930' и rtrim (m.dd) = '' then 'Y' else 'N' end as mtDNA_Candidate, уменьшить (srt2 = '|', q IN nodes (p) | srt2 + q.RN + '|') AS PathOrder порядок по генерации desc, PathOrder desc " ^ –

ответ

1

[ОБНОВЛЕНО]

[r:mother*..22|father*..1] синтаксис является незаконным. Связь в запросе Cypher может иметь не более одной спецификации переменной длины, и она должна называться после типа (ов) отношений. (Кроме того, обратите внимание также, что [:father*..1] - это то же самое, что и у [:father]).

Этот запрос, который кажется логически эквивалентным, работает на вас?

MATCH pf=(n { RN:1 })-[:father]->() 
MATCH pm=n-[:mother*..22]->() 
WITH [pf] + COLLECT(pm) AS paths 
UNWIND paths AS p 
WITH LENGTH(p) AS generation, NODES(p) AS ancestors 
WITH generation, ancestors, LAST(ancestors) AS m 
RETURN m.RN AS RN, m.fullname AS FullName, m.sex AS Sex, m.bd AS BD, m.dd AS DD, generation, 
    CASE WHEN left(m.bd,4)>'1930' AND rtrim(m.dd)='' THEN 'Y' ELSE 'N' END AS mtDNA_Candidate, 
    reduce(srt2 ='|', q IN ancestors | srt2 + q.RN + '|') AS PathOrder 
ORDER BY generation DESC, PathOrder DESC; 
+0

Сообщение об ошибке для этого - Неизвестный идентификатор 'UNNAMED22', который я не понимаю –

+0

У моего запроса была ошибка , 'WITH pf + ...' должно быть 'WITH [pf] + ...'. Я исправил свой ответ. Он работает теперь для вас? – cybersam

Смежные вопросы