2015-10-17 97 views
1

我在我的rails應用程序中使用neo4j.rb。Neo4j rb查找2個節點之間的連接

我已經有兩個節點n1和n2從數據庫中檢索。

現在我需要檢查,如果他們有他們之間的路徑,我想用用的Neo4j :: Session.query

暗號查詢,但因爲我已經有兩個節點,我不想對它們進行檢索再次在查詢中,(它影響性能?)有沒有辦法做到這一點?

我知道我可以使用query1 = n1.query_as(:node1)並將其用作節點標識符,但是如何將n2引入同一個查詢對象中,以便我可以檢查它們之間的連通性。

我想要的東西相當於查詢

RETURN 
    CASE 
    WHEN node1-[*..6]-node2 
    THEN 'Connected within 6 nodes' 
    ELSE 'Not connected within 6' 
    END 

如果我已經有節點1和節點。

是否可以這樣做,也可以不使用CYPHER DSL?

+0

我不知道誰downvoted,但是這是一個很大的問題,謝謝! –

回答

2

你在這裏!

n1.query_as(:n1).match_nodes(n2: n2).match('n1-[*1..6]-n2').count 

如果你想避免Cypher支架DSL我認爲你可以做到這一點與聯想。作爲首發如穿越關係的一個級別,你可以這樣做:

class N1Class 
    include Neo4j::ActiveNode 

    has_many :out, :test_association, type: :TEST_ASSOCIATION, model_class: :N2Class 
end 

n1.test_association.include?(n2) 

這將考驗,如果他們直接通過test_association協會連接。您甚至可以爲您的type指定false以忽略方向,falsemodel_class忽略目標標籤。

爲了得到可變長度,你可以這樣做:

n1.test_association(nil, nil, rel_length: 1..6).include?(n2) 
+0

不錯,我不知道,你可以做到這一點沒有密碼DSL,有沒有辦法我們可以得到兩個節點之間的最短路徑呢? –

+0

是的,我也在想同樣的事情,我的密碼不工作,它正在返回節點網址,我會發布另一個問題。 –

+0

好主意!我認爲你可以在Cypher DSL之外做到這一點,但我剛剛創建了這個問題來捕獲它:https://github.com/neo4jrb/neo4j/issues/994 –

相關問題