2016-06-30 160 views
1

我正在組織一個公司合併和收購信息的數據庫,並且對於數據庫中的任何收購公司,我需要找到它的當前公司。基本上,我需要找到每個節點的根節點。查找neo4j密碼查詢中所有節點的根節點

我一直在玩這個Neo4j數據庫,因爲我認爲一個基於圖形的數據庫可能是一個不錯的選擇。我的結構看起來像這樣(原諒缺乏適當的語法,這僅僅是爲了清楚起見):

(Company)-[Acquired]->(Company)-[Acquired]->(Company)...etc. 

這可能是一個級別,例如一家公司收購了另一家公司,這是事情的結局,或者可能有多個層次,一家公司收購另一家公司,然後收購另一家公司,等等。

我需要做的是列出數據庫中的每個公司(現在只有大約500個公司)及其當前公司所有者。

雖然我知道一些SQL和其他語言(Java,Python),但我在查詢語言在線時遇到了問題,所以我的Cypher查詢技能目前很差,不知道從哪裏開始。任何幫助將真誠感謝。謝謝!

P.S.如果你有更好的想法,應該使用哪種數據庫,或者更好的數據庫設計,我很樂意聽到它。

回答

1

讓我們把一個樣本數據集:

CREATE (c1:Company {id:1}), 
     (c2:Company {id:2}), 
     (c3:Company {id:3}), 
     (c4:Company {id:4}), 
     (c5:Company {id:5}), 
     (c6:Company {id:6}), 
     (c7:Company {id:7}), 
     (c8:Company {id:8}), 
     (c9:Company {id:9}), 
     (c10:Company {id:10}), 

     (c2)-[:ACQUIRED]->(c3), 
     (c4)-[:ACQUIRED]->(c5)-[:ACQUIRED]->(c6), 
     (c7)-[:ACQUIRED]->(c8)-[:ACQUIRED]->(c9), 
     (c8)-[:ACQUIRED]->(c10) 

enter image description here

這允許我們測試了幾個不同的方案:

  • 一個公司沒有收購另一家公司(ID 1 )
  • 獲取的長度= 1路徑(ID2,3)
  • 還有就是獲取(IDS 4,5,6)
  • 有支獲取(IDS 7,8,9,10)

長度> 1路然後你就可以得到公司的名單和他們的主人是這樣的:

MATCH ownership = shortestPath((owner:Company)-[:ACQUIRED*0..]->(acquired:Company)) 
WHERE NOT()-[:ACQUIRED]->(owner) 
RETURN acquired.id AS company, head(nodes(ownership)).id AS owner; 

╒═══════╤═════╕ 
│company│owner│ 
╞═══════╪═════╡ 
│1  │1 │ 
├───────┼─────┤ 
│2  │2 │ 
├───────┼─────┤ 
│3  │2 │ 
├───────┼─────┤ 
│4  │4 │ 
├───────┼─────┤ 
│5  │4 │ 
├───────┼─────┤ 
│6  │4 │ 
├───────┼─────┤ 
│7  │7 │ 
├───────┼─────┤ 
│8  │7 │ 
├───────┼─────┤ 
│9  │7 │ 
├───────┼─────┤ 
│10  │7 │ 
└───────┴─────┘ 
+0

謝謝你的迴應和很好的例子!不幸的是,該查詢不適合我。它只是返回公司名稱本身,而不是它的主人。因爲「公司」在我的數據庫中包含名稱,所以我用'company'替換了'id'。但除此之外,我還應該對該代碼進行其他更改以適應特定的數據庫嗎?再次感謝! –

+0

如果你可以給我一個你的數據集的樣本,我們可以找出正確的屬性來使用。 –

+0

@NickBurleigh是否有可能使用錯誤的關係類型?確保編輯查詢以使用正確的關係類型。它是區分大小寫的。 –

相關問題