[英]Best approach for graph nodes relationship in Neo4J (Cypher)
我試圖在我的 Neo4J 圖形數據庫中實現以下數據結構:
(User)-[:isEmployedBy]->(Company)
而每個“雇佣”可以有多個“交易”
我正在考慮以下選項,並想知道哪個是最“未來的證明”:
最簡單的:
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
return *
但是,我無法在我的工作中添加其他關系(例如交易)。 我認為我的第二種方法是我唯一的選擇? 這個對嗎? (見下文)
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(employment:Employment, { from: date("2000-01-01"), until: date("2010-01-01")}),
(t1:Payment, { amount: 100 }),
(t2:Payment, { amount: 50 }),
(employment)-[:received]->(t1)
(employment)-[:received]->(t2)
return *
我知道我可以將這些交易直接附加到該人,但我需要將它們與工作直接相關聯,例如:如果該人失去工作(連接),所有交易都需要消失。
3)我也可以做這兩個連接:
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(employment:Employment, { from: date("2000-01-01"), until: date("2010-01-01")}),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
(matt)-[:has_employment]->(employment)<-[:has_employment]-(stackoverflow)
return *
雖然我可能會遇到不一致的數據(此處的日期),但如果說我只想查看誰被誰雇用而沒有更多詳細信息/交易,這種方法是否會給我帶來查詢性能優勢? (使用:employed_by)。
一般問題:我想(或需要)設置雙向連接嗎?
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
(matt)<-[:employs { from: date("2000-01-01"), until: date("2010-01-01") }]-(stackoverflow),
return *
同樣,我最終會得到重復的信息 - 這有什么好處嗎?
感謝您的任何提示!
選項 #3 接近我的建議,除了:
:employed_by
關系是多余的,應該省略以避免浪費存儲空間、使某些查詢過於復雜以及帶來不一致的風險。 Employment
節點包含相同的信息。Employment
節點的兩側使用相同的關系類型,以避免混淆並可能使未來的查詢更有效率。此外,在 neo4j 使用的標准命名約定中,關系名稱全部大寫(例如,“HAS_EMPLOYMENT”)。 它實際上有助於更輕松地閱讀您的 Cypher 代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.