2013-08-17 70 views
1

從Neo4j 1.9.2開始,並使用Cypher查詢語言,我想創建具有特定屬性值的節點之間的關係。 我有一組具有屬性H的節點G,G節點之間當前沒有任何關係。使用一個Cypher查詢創建具有相同屬性值的節點之間的關係

在Cypher語句中,是否有可能通過H屬性值對G節點進行分組,並在每個節點之間創建一個關係HR以成爲同一組?知道每個組的大小在2 & 10之間,並且對於大約50k G節點,我有超過15k個這樣的組(15k個不同的H值)。

我試過很難管理這樣的查詢,卻沒有找到正確的語法。下面是一個小樣本數據集:

create 
(G1 {name:'G1', H:'1'}), 
(G2 {name:'G2', H:'1'}), 
(G3 {name:'G3', H:'1'}), 

(G4 {name:'G4', H:'2'}), 
(G5 {name:'G5', H:'2'}), 
(G6 {name:'G6', H:'2'}), 
(G7 {name:'G7', H:'2'}) 
return * ; 

最後,我想這樣的關係:

G1-[:HR]-G2-[:HR]-G3-[:HR]-G1 

和:

G4-[:HR]-G5-[:HR]-G6-[:HR]-G7-[:HR]-G4 

在另一種情況下,我可能需要更新大量使用/比較一些屬性的節點之間的關係。假設類型爲N的節點和類型爲M的節點,N個節點與M有關,其關係名爲:IS_LOCATED_ON。位置的順序可以作爲N個節點的屬性來存儲(N.relativePosition從1到MAX_POSITION長),但是我們可能稍後需要以這種方式更新圖模型:使N個節點之間通過新的: PRECEDES關係,這樣我們就可以在給定集合上找到更容易和更快的下一個節點N.

我希望這樣的語言可以允許更新大量的節點/關係操縱其屬性。

  • 難道不可能嗎?
  • 如果不是,是否計劃或可能計劃?

任何幫助將不勝感激。

回答

2

由於沒有什麼你提供獲得排名的數據,我已經收藏 發揮得到一個如下:

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H 
WITH n, n2 ORDER BY n2.name 
WITH n, COLLECT(n2) as others 
WITH n, others, LENGTH(FILTER(x IN others : x.name < n.name)) as rank 
RETURN n.name, n.H, rank ORDER BY n.H, n.name; 

大廈關閉的那然後就可以開始確定關係的

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H 
WITH n, n2 ORDER BY n2.name 
WITH n, COLLECT(n2) as others 
WITH n, others, LENGTH(FILTER(x IN others : x.name < n.name)) as rank 
WITH n, others, rank, COALESCE(
    HEAD(FILTER(x IN others : x.name > n.name)), 
    HEAD(others) 
    ) as next 
RETURN n.name, n.H, rank, next ORDER BY n.H, n.name; 

最後(稍微更稠)

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H 
WITH n, n2 ORDER BY n2.name 
WITH n, COLLECT(n2) as others 
WITH n, others, COALESCE(
    HEAD(FILTER(x IN others : x.name > n.name)), 
    HEAD(others) 
    ) as next 
CREATE n-[:HR]->next 
RETURN n, next; 
+0

你好@LameCoder,謝謝你的回答。這個查詢不是很直接,但我理解這個邏輯。 因爲我不需要在節點上創建HR自我關係,所以我們可以添加另一個限制(g1 <> g2),它允許刪除COALESCE語句,因爲我們不需要按名稱命令g2: (g1.H)和HAS(g2.H)AND g1.H = g2.H AND g1≠g2 WITH g1,COLLECT(*),g2 = node(*) WHERE g2)as other WITH g1,HEAD(others)as next CREATE g1 - [:HR] - > next RETURN g1,next; –

+0

(...繼續...) 查詢當前正在運行,但執行真的很長。您的查詢運行時間超過8小時(30052902毫秒),並創建了47412個關係,因爲我在數據集上除外。 看來,2節點START子句是一種糟糕的方法,即使我使用索引來查找g1和g2。 上述更新後的查詢當前正在運行,如果它提高了性能,我會在稍後看到結果,但它在幾個小時後運行,因此這種方法不是一個好的解決方案。使用Java代碼花費幾秒鐘來加載數據並創建關係。 無論如何感謝您的提示@LameCoder。 ;) –

+0

@RaphaelF。這不是一個理想的解決方案。我只是想看看我們可以讓Cypher做什麼,這是一個非常有趣的謎題。像這樣的問題讓我希望有存儲過程。 – LameCoder

0

你可以只是那樣做,也許表明方向的關係:

CREATE 
    (G1 { name:'G1', H:'1' }), 
    (G2 { name:'G2', H:'1' }), 
    (G3 { name:'G3', H:'1' }), 
    (G4 { name:'G4', H:'2' }), 
    (G5 { name:'G5', H:'2' }), 
    (G6 { name:'G6', H:'2' }), 
    (G7 { name:'G7', H:'2' }), 
    G1-[:HR]->G2-[:HR]->G3-[:HR]->G1, 
    G4-[:HR]->G5-[:HR]->G6-[:HR]->G7-[:HR]->G1 

爲例見http://console.neo4j.org/?id=ujns0x

+0

您好,叔他的問題是圖形已經與所有節點一起創建。我不能硬編碼每個45k節點的關係。我想稍後使用Cypher創建它們。我想我可以使用Java語言,但我在這裏想知道Cypher的功能。 –

相關問題