1

如果我們在neo4j中創建自我指涉的節點,可以嗎?我需要在大數據環境中使用它,所以性能確實很重要。 我找到了一個例子here,但需要知道更多的意見。一般哪一個更好?使用自引用節點還是將它們分解爲具有不同標籤和關係的單獨節點? 我的場景是創建電子商務標籤組和標籤。 TAG_GROUP有TAG,這很清楚。但是有些標籤可能有子標籤。因此,可以有2個解決方案:neo4j中的自我指涉節點

1)要使用TAG- [has] -TAG自引用標記,並具有像{parentID,isSubTag,...}這樣的屬性,關於這個的好處是我可以去多個子標籤級別。不過,我不確定表現如何。

2)使用TAH- [具有] -SUB_TAG。那麼也許這個更簡單,更容易理解。但是如果SUB_TAG本身有一個SUB_SUB標籤呢?

任何幫助,將不勝感激。

PSI我要使用的Neo4j 3.0.1獨立服務器和Spring數據的Neo4j 4.1.1

+0

我不知道這個問題是一個非常適合的網站,因爲沒有一個答案。我建議您採用最乾淨,最適合您的數據模型的方法,只在實踐中遇到問題時擔心性能。我看不出爲什麼你描述的兩種方法表現不同;自我參照與否應該沒有區別。 – Mikesname

回答

2

說到SDN的使用情況外,你描述的是一個層次,它絕對可以模擬自然在Neo4J。

父母/孩子的概念只需與關係完成,不需要屬性。

(Tag)-[:CHILD]->(Tag)-[:CHILD]->(Tag) 

我想你會的產品有關聯標籤,一個標籤可以再tags產品:

(Tag)-[:TAGS]->(Product) 

查找某個產品的相關標籤一樣簡單:

MATCH (product:Product {id: 1}) 
OPTIONAL MATCH (product)<-[:TAGS]-(tag) 
RETURN product, collect(tags) as tag 

OPTIONAL MATCH考慮了沒有標籤而沒有打破查詢的產品

如果你想每個標籤的標籤完整的層次標記的產品

MATCH (product:Product {id: 1}) 
OPTIONAL MATCH (product)<-[:TAGS]-()<-[:CHILD*0..]-(tag) 
RETURN product, collect(tag) as tags 

這裏0是考慮到當標籤沒有父母將tags集合中嵌入()的情況。

我建議你下面的建模和Cypher部分讀取,我敢肯定有人可以添加一個答案爲SDN這一方。

http://graphaware.com/neo4j/2013/10/11/neo4j-bidirectional-relationships.html

http://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html

+0

謝謝克里斯託弗。 (標籤) - [:兒童] - >(標籤) - [:兒童] - >(標籤)正是我需要澄清的情況。 BTW鏈接非常有用!感謝那 ! – Lina