2015-05-01 52 views
1

Neo4j中的關係/箭頭不能獲得多個類型/標籤(請參見herehere)。我有一個邊緣需要獲取標籤和(可能)屬性的數據模型。如果我決定使用Neo4j(而不是支持標籤箭頭的OriendDB),我想我會有兩種選擇來建模兩個節點A和B之間的箭頭f:將Neo4j中的箭頭/關係建模爲節點

1)將箭頭f編碼爲一個跨度,比如A < --f - > B,這樣f也是一個節點,並且 - >和< - 是箭頭。

2)編碼如箭頭F A - >的F - > B,使得f是再次節點和兩個 - >是箭頭。

雖然這似乎是在我的數據模型上添加unnecessary complexity,但如果我想使用Neo4j,目前似乎沒有任何其他選項。然後,我試圖看看上面的哪些編碼更適合我的查詢(查詢是我係統的核心)。爲此,我需要訴諸實例。所以,我有兩個問題:

第一個問題:

第一部分)我有標註爲個人和父親節點,並在它們之間有箭似Person<-[:sr]-father-[:tr]->Person以模特是誰的父親誰(tr是sr的父親)。對於一個給定的人P1,我怎麼能得到他所有的祖先。

part2)如果我有Person-[:sr]->father-[:tr]->Person結構代替,爲建模父親關係,如何上述相同的查詢看起來像。

這回答here當父親被認爲是一個簡單的關係(而不是被編碼爲一個節點)

第二個問題:

part1的)我已標記節點作爲每個屬性爲p1的節點。我想查詢A節點,得到那些元素p1 < 5,然後創建以下結構:對於查詢結果中的每個a1,我創建qa1<-[:sr]-isA-[:tr]->a1,使得isA和qa1是節點。

part2)如果我想創建qa1-[:sr]->isA-[:tr]->qa1而不是?

當isA被認爲是簡單的箭頭(而不是被建模爲節點)時,回答此問題here

回答

3

首先,一些術語;關係沒有標籤,他們只有類型。是的,每種關係都有一種類型。

二,相對於造型而言,我認爲方向的關係並不總是非常重要,因爲使用neo4j你可以輕鬆地遍歷它。所以A-->f-->BA<--f-->B之間的區別我認爲應該完全驅動你的域的語義上有意義的東西,沒有別的。所以你的選項(1)和(2)在整體複雜性上看起來與我相同,這使我想到了第3點:

你的主要選擇是將一個複雜的關係變爲一個節點我認爲我們在這裏打電話f)或保持它作爲一種關係。將「關係變爲節點」稱爲reification,我認爲這是一個相當標準的做法,以適應一些建模問題。它增加了複雜性(通過簡單的關係),但增加了靈活性。這是一個非常標準的工程權衡。

所有這一切說,對於你的第一個問題,我不會推薦一箇中間節點。 :father是一個非常簡單的關係,我不明白你爲什麼需要多於一個標籤。因此,對於問題一,我會選擇「你沒有列出的選項」,而將其設爲(personA)-[:father]->(personB)。更簡單。你會查詢該說

MATCH (personA { name: "Bob"})-[:father]->(bobsDad) RETURN bobsDad 

是的,你可以模擬這種爲(personA)-[:sr]->(fatherhood)-[:tr]->(personB),但我不明白這是如何獲得你多少。至於關係方向,對於性能或查詢來說同樣重要,只適用於任何:tr:sr應該表示的語義。

我有節點標記爲A節點與屬性p1爲每個。我想要 查詢A節點,得到那些元素p1 < 5,然後創建 以下結構:對於查詢結果中的每個a1,我創建 qa1 < - [:sr] -isA - [:tr] - > a1這樣isA和qa1就是節點。

那就是:

MATCH (aNode:A) 
WHERE aNode.p1 < 5 
WITH aNode 
MATCH (qa1 { label: "some qa1 node" }) 
CREATE (qa1)<-[:sr]-(isA)-[:tr]->aNode; 

注意,您需要調整標準qa1,還可以指定一些有意義的isA

如果我想創建qa1 - [:sr] - > isA - [:tr] - > qa1,那該怎麼辦?

修改上面的查詢應該是微不足道的,只需要改變箭頭的方向,同樣的查詢。

+0

我把'(personA) - [:father] - >(personB)'作爲一個例子來看看如果我傳遞所有的箭頭,傳遞閉包查詢會是什麼樣子。所以你是對的,在這個特定的例子中,我沒有得到任何額外的點。 – qartal

相關問題