2014-01-14 55 views
3

我有一個多節點與多個節點之間的關係。我嘗試製作一個Cypher查詢,返回通過具有不同屬性的兩個關係連接的節點:neo4j 2.0/Cypher:通過2個不同的關係連接匹配節點

標籤爲Mirna的節點連接到GeneREGULATES的關係。我想返回所有由REGULATESsource屬性first_dbsecond_db連接的所有MirnaGene節點。

Graph schema

這裏是我的嘗試:http://gist.neo4j.org/?4fddc897b30ef7aa4732

這工作,但它是大數據集的速度很慢。我想是因爲我匹配了太多的開頭:

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene) 
WITH m,g, collect(r.source) AS source  
WHERE 'first_db' IN source AND 'second_db' IN source 
RETURN m,g 

此執行速度更快,並給出了玩具的數據相同的結果:

MATCH (m:Mirna)-[r:REGULATES { source: 'first_db' }]->(g:Gene), 
     (m:Mirna)-[r2:REGULATES { source: 'second_db' }]->(g:Gene) 
RETURN m,g,r,r2 

但是,這是安全的,並沒有暗號始終明白,我想要兩個同一個節點之間的關係?是否有另一種更有效/優雅的方式來查詢多個關係?

+1

由於您使用相同的標識符「M」和「G」它應該是安全的,但也許一些小的調整會使查詢更快(可能會在第二次提到標識符時放棄標籤,也許將其表示爲一種模式,即a(a) - [r1] - (b) - [r2] - (a)',儘管我不確定沒有分析的差異)。這是一種確定性估計嗎?即「至少有兩個權威人士說x,所以x可能是這樣的事情? – jjaderberg

+0

一種模式似乎更容易,沒有出現在我的腦海裏。是的,這是一個確定性估計器。如果兩個數據源同意「基因」是受管制的,我認爲它更真實;) –

+0

作爲一種模式,性能是否存在差異?在許多情況下,密碼引擎可能會重構最好的引擎,所以也許沒有什麼區別(儘管看起來更好)。也許在生物學中有些東西是'更真實的',但在我的領域我們持懷疑態度;)我使用neo4j做了類似的'可能的科學',但數據差別很大;很想喝咖啡,並且有時候會聽到你的工作。 – jjaderberg

回答

3

你的第一個查詢過濾太晚了,所以它不能被包含在模式匹配中,這就是爲什麼它比較慢(除了作爲全局圖形查詢之外)。

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene) 
WHERE r.source = 'first_db' OR r.source = 'second_db' 
WITH m,g, collect(r.source) AS source  
WHERE 'first_db' IN source AND 'second_db' IN source 
RETURN m,g 

如果沒有誤報,你還可以將其簡化爲這樣:

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene) 
WHERE r.source = 'first_db' OR r.source = 'second_db' 
WITH m,g, count(distint r.source) AS source  
WHERE source = 2 
RETURN m,g 
+0

好主意,沒有列表搜索。不幸的是有third_db ... nth_db :)第二個查詢執行得更好,但它的工作?不是我不相信Cypher的魔法,而是更安全......;) –

相關問題