2016-01-22 71 views
2

在遺傳系譜中,X染色體數據對於某些祖先是有用的。這可以很好地說明:X-DNA Inheritance ChartX染色體祖先的Neo4j密碼查詢

我的Neo4j數據庫具有每個Person的節點以及連接他們的父親和母親的關係。每個節點都有屬性(對於Person的性別; M或F)。一位女性有兩條X染色體,一條來自父母。一名男性有一條X染色體,總是來自母親。

可以使用降低看到祖輩參與繼承的性別:

match p=(n:Person{RN:1})-[:father|mother*..20]->m 
return m.fullname as FullName 
,reduce(status ='', q IN nodes(p)| status + q.sex) AS c 
order by length(p), c 

所以,開始與男性(RN:1),C:的結果是MM爲他的父親和工頻磁場他的母親,祖父的MMM以及祖父的MFM等等。這種模式表明,當c包含MM(兩個Ms連在一起時),這些不是對起始Person的X染色體的貢獻。

我想刪除任何具有MM模式的節點。用外部代碼很容易做到這一點,但我無法弄清楚如何在密碼查詢中執行此操作。

回答

2

這應該爲你工作:

MATCH p=(n:Person { RN:1 })-[:father|mother*..20]->m 
WITH m, NODES(p) AS a 
WITH m, REDUCE(c = "", i IN RANGE(0, SIZE(a)-1)| CASE 
    WHEN c IS NULL OR (i > 0 AND (a[i-1]).sex = "M" AND (a[i]).sex = "M") THEN 
    NULL 
    ELSE 
    c + (a[i]).sex 
    END) AS c 
WHERE c IS NOT NULL 
RETURN m.fullName AS fullName, c 
ORDER BY LENGTH(c); 

而且here is a console演示的結果。

+0

太好了。它確實有效。花費一點時間(〜750毫秒),但不需要外部代碼進行後期處理。所以這就是我需要的! –

1

有點遲到參加派對和思博思的解決方案。

match p=(n:Person { RN: 1 })-[:father|mother*..20]->(m) 
with p, m, extract(g in nodes(p) | g.sex) as genders 
with p, m, genders, range(0,size(genders) -1,1) as gender_index 
unwind gender_index as idx 
with p, m, genders, collect([genders[idx], genders[idx+1]]) as pairs 
where not ['M','M'] in pairs 
return m.fullName 
,reduce(status ='', q IN nodes(p)| status + q.sex) AS c 
order by length(p), c 
+0

它給出了一個錯誤:未知的標識符'n'。我仔細研究了這個,不明白爲什麼。它看起來是一個很好的解決方案,但它不起作用。 –

+0

對不起,我不得不抄錄一些項目和我的數據不完全相同。我對那裏的內容做了一些更新,如果你想的話,你可以再試一次。 –

+0

仍然得到錯誤:未知的標識符'n' ..我相信這可能是因爲idx + 1超過了性別的範圍。 –

0

這個查詢,僅得到促進的X染色體我的祖先:

match p=(n:Person{RN:1})-[:father|mother*..20]->(m)  
with m, reduce(status ='', q IN nodes(p)| status + q.sex) AS c  
where c=replace(c,'MM','') 
return m.RN,m.fullname as Name, c 

性別的收集增加了性別對每一代和過濾,排除任何MM因爲男性無法傳送其X到另一個男性(例如兒子)。