2014-12-27 33 views
0

我正試圖在Neo4j中實現一個數據模型。該模型在城市和街道上有興趣點。街道連接點。 最初我認爲點和街道都應該作爲節點在圖形數據庫中表示。 在這兩種不同類型的節點之間存在一種關係(「與...連接」)。 現在我想到的可能是,不是將街道表示爲節點,或許將街道表示爲關係更爲正確(「連接兩點」) 這實際上是我的問題。在模型中表示網絡(線路部分)的更正確方法是什麼?使用節點還是關係?如何在Neo4j中表示網絡的線路

回答

3

關係和節點之間唯一的主要區別是關係必須存在於兩個節點之間。這意味着如果您沒有存儲連接的兩個興趣點,則無法存儲特定的街道。所以,如果你看到這是一個問題,你可能想要將街道存儲爲節點。如果您確信只有在街道上存在您的數據庫中存在感興趣的點時纔會存儲街道,那麼將街道表示爲關係更有意義。

通常,您應該儘量避免將節點中的屬性存儲在僅用於查找它們之間關係的節點中。在這種情況下,您會提到可能的故事情節,即每個感興趣的節點中的「關聯點」屬性。這會起作用,但實際上只是說在兩個點之間存在關係而不實際使用關係。再一次,如果您希望能夠存儲不存在興趣點的街道,則可能需要這樣做,並且您可以存儲沒有興趣點的街道,方法是將「點與「屬性連接爲NULL,但我會建議反對這一點。

要思考的另一件事是你將存儲在關係中。如果使用街道爲節點的模型,則很難表示像感興趣點之間的距離之類的數量,而無需爲這些屬性特別添加關係,這可能也是街道關係的屬性。

UPDATE:以爲我會添加一個示例查詢來說明如何使街道關係可以簡化您的邏輯並使您的數據庫更簡單,更直觀。

想象一下,你想找到點的點A和B之間的利益最少的路徑

這是查詢將會是什麼樣的關係模型:

MATCH (a:Point {name: "foo"}), (b:Point {name: "bar"}), 
    p = shortestPath(a-[*:Street]-b) 
RETURN p 

利用關係在適當的情況下,您可以啓用Neo4j的功能,使您可以使用相對簡單的查詢完成大量工作。在將街道表示爲節點的模型中,很難想出一種將此查詢寫入的方法,但它很可能會更復雜且效率更低。

相關問題