我有一個多節點與多個節點之間的關係。我嘗試製作一個Cypher查詢,返回通過具有不同屬性的兩個關係連接的節點:neo4j 2.0/Cypher:通過2個不同的關係連接匹配節點
標籤爲Mirna
的節點連接到Gene
與REGULATES
的關係。我想返回所有由REGULATES
與source
屬性first_db
和second_db
連接的所有Mirna
和Gene
節點。
這裏是我的嘗試: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
但是,這是安全的,並沒有暗號始終明白,我想要兩個同一個節點之間的關係?是否有另一種更有效/優雅的方式來查詢多個關係?
由於您使用相同的標識符「M」和「G」它應該是安全的,但也許一些小的調整會使查詢更快(可能會在第二次提到標識符時放棄標籤,也許將其表示爲一種模式,即a(a) - [r1] - (b) - [r2] - (a)',儘管我不確定沒有分析的差異)。這是一種確定性估計嗎?即「至少有兩個權威人士說x,所以x可能是這樣的事情? – jjaderberg
一種模式似乎更容易,沒有出現在我的腦海裏。是的,這是一個確定性估計器。如果兩個數據源同意「基因」是受管制的,我認爲它更真實;) –
作爲一種模式,性能是否存在差異?在許多情況下,密碼引擎可能會重構最好的引擎,所以也許沒有什麼區別(儘管看起來更好)。也許在生物學中有些東西是'更真實的',但在我的領域我們持懷疑態度;)我使用neo4j做了類似的'可能的科學',但數據差別很大;很想喝咖啡,並且有時候會聽到你的工作。 – jjaderberg