intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系
intent隱式和顯式
我最近閱讀了Michal Bachman關于 Neo4j中雙向關系的文章 ,他建議對于某些關系類型,我們對關系的方向不那么感興趣,因此可以在查詢時忽略它。 他使用以下示例顯示Neo Technology和GraphAware之間的合作關系:
兩家公司都是彼此的合作伙伴,但是由于我們可以盡快找到傳入和傳出的關系,因此我們最好在兩家公司/節點之間只有一種關系。
當我們想使圖中的隱式關系顯式時,經常會出現這種模式。 例如,我們可能有以下圖表描述了他們從事的人員和項目:
我們可以使用以下密碼語法在Neo4j 2.0中創建該圖:
CREATE (mark:Person {name: "Mark"}) CREATE (dave:Person {name: "Dave"}) CREATE (john:Person {name: "John"})CREATE (projectA:Project {name: "Project A"}) CREATE (projectB:Project {name: "Project B"}) CREATE (projectC:Project {name: "Project C"})CREATE (mark)-[:WORKED_ON]->(projectA) CREATE (mark)-[:WORKED_ON]->(projectB) CREATE (dave)-[:WORKED_ON]->(projectA) CREATE (dave)-[:WORKED_ON]->(projectC) CREATE (john)-[:WORKED_ON]->(projectC) CREATE (john)-[:WORKED_ON]->(projectB)如果我們想弄清楚哪些人彼此認識,我們可以編寫以下查詢:
MATCH (person1:Person)-[:WORKED_ON]-()<-[:WORKED_ON]-(person2) RETURN person1, person2==> +-------------------------------------------------------+ ==> | person1 | person2 | ==> +-------------------------------------------------------+ ==> | Node[500363]{name:"Mark"} | Node[500364]{name:"Dave"} | ==> | Node[500363]{name:"Mark"} | Node[500365]{name:"John"} | ==> | Node[500364]{name:"Dave"} | Node[500363]{name:"Mark"} | ==> | Node[500364]{name:"Dave"} | Node[500365]{name:"John"} | ==> | Node[500365]{name:"John"} | Node[500364]{name:"Dave"} | ==> | Node[500365]{name:"John"} | Node[500363]{name:"Mark"} | ==> +-------------------------------------------------------+ ==> 6 rows我們可能想在每對人之間創建一個KNOWS關系:
MATCH (person1:Person)-[:WORKED_ON]-()<-[:WORKED_ON]-(person2) CREATE UNIQUE (person1)-[:KNOWS]->(person2) RETURN person1, person2現在,如果我們運行一個查詢(忽略關系方向)以找出彼此認識的人,我們將得到很多重復的結果:
MATCH path=(person1:Person)-[:KNOWS]-(person2) RETURN person1, person2, path==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | person1 | person2 | path | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | Node[500363]{name:"Mark"} | Node[500364]{name:"Dave"} | [Node[500363]{name:"Mark"},:KNOWS[528536]{},Node[500364]{name:"Dave"}] | ==> | Node[500363]{name:"Mark"} | Node[500365]{name:"John"} | [Node[500363]{name:"Mark"},:KNOWS[528537]{},Node[500365]{name:"John"}] | ==> | Node[500363]{name:"Mark"} | Node[500364]{name:"Dave"} | [Node[500363]{name:"Mark"},:KNOWS[528538]{},Node[500364]{name:"Dave"}] | ==> | Node[500363]{name:"Mark"} | Node[500365]{name:"John"} | [Node[500363]{name:"Mark"},:KNOWS[528541]{},Node[500365]{name:"John"}] | ==> | Node[500364]{name:"Dave"} | Node[500363]{name:"Mark"} | [Node[500364]{name:"Dave"},:KNOWS[528538]{},Node[500363]{name:"Mark"}] | ==> | Node[500364]{name:"Dave"} | Node[500365]{name:"John"} | [Node[500364]{name:"Dave"},:KNOWS[528539]{},Node[500365]{name:"John"}] | ==> | Node[500364]{name:"Dave"} | Node[500363]{name:"Mark"} | [Node[500364]{name:"Dave"},:KNOWS[528536]{},Node[500363]{name:"Mark"}] | ==> | Node[500364]{name:"Dave"} | Node[500365]{name:"John"} | [Node[500364]{name:"Dave"},:KNOWS[528540]{},Node[500365]{name:"John"}] | ==> | Node[500365]{name:"John"} | Node[500364]{name:"Dave"} | [Node[500365]{name:"John"},:KNOWS[528540]{},Node[500364]{name:"Dave"}] | ==> | Node[500365]{name:"John"} | Node[500363]{name:"Mark"} | [Node[500365]{name:"John"},:KNOWS[528541]{},Node[500363]{name:"Mark"}] | ==> | Node[500365]{name:"John"} | Node[500363]{name:"Mark"} | [Node[500365]{name:"John"},:KNOWS[528537]{},Node[500363]{name:"Mark"}] | ==> | Node[500365]{name:"John"} | Node[500364]{name:"Dave"} | [Node[500365]{name:"John"},:KNOWS[528539]{},Node[500364]{name:"Dave"}] | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> 12 rows每對人出現4次,如果我們以馬克和戴夫為例,我們可以看到原因:
MATCH path=(person1:Person)-[:KNOWS]-(person2) WHERE person1.name = "Mark" AND person2.name = "Dave" RETURN person1, person2, path==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | person1 | person2 | path | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | Node[500363]{name:"Mark"} | Node[500364]{name:"Dave"} | [Node[500363]{name:"Mark"},:KNOWS[528536]{},Node[500364]{name:"Dave"}] | ==> | Node[500363]{name:"Mark"} | Node[500364]{name:"Dave"} | [Node[500363]{name:"Mark"},:KNOWS[528538]{},Node[500364]{name:"Dave"}] | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> 2 rows如果我們看一下路徑欄下有兩個不同的KNOWS關系(與IDS 528536和528538),馬克和戴夫,一個去之間從馬克戴夫和其他來自Dave馬克。
正如Michal在他的帖子中指出的那樣,在這種情況下,不需要兩個關系。 我們只需要一種關系,可以通過創建KNOWS關系時不指定方向來實現:
MATCH (person1:Person)-[:WORKED_ON]-()<-[:WORKED_ON]-(person2) CREATE UNIQUE (person1)-[:KNOWS]-(person2) RETURN person1, person2現在,如果我們重新運行查詢以檢查Mark和Dave之間的關系,則只有一個:
MATCH path=(person1:Person)-[:KNOWS]-(person2) WHERE person1.name = "Mark" AND person2.name = "Dave" RETURN person1, person2, path==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | person1 | person2 | path | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | Node[500375]{name:"Mark"} | Node[500376]{name:"Dave"} | [Node[500375]{name:"Mark"},:KNOWS[528560]{},Node[500376]{name:"Dave"}] | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> 1 row在這種情況下,關系從Mark到Dave,可以通過執行一些考慮方向的查詢來看到:
MATCH path=(person1:Person)-[:KNOWS]->(person2) WHERE person1.name = "Mark" AND person2.name = "Dave" RETURN person1, person2, path==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | person1 | person2 | path | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> | Node[500375]{name:"Mark"} | Node[500376]{name:"Dave"} | [Node[500375]{name:"Mark"},:KNOWS[528560]{},Node[500376]{name:"Dave"}] | ==> +--------------------------------------------------------------------------------------------------------------------------------+ ==> 1 rowMATCH path=(person1:Person)<-[:KNOWS]-(person2) WHERE person1.name = "Mark" AND person2.name = "Dave" RETURN person1, person2, path==> +--------------------------+ ==> | person1 | person2 | path | ==> +--------------------------+ ==> +--------------------------+ ==> 0 row 參考: Neo4j:通過Mark Needham博客博客的JCG合作伙伴 Mark Needham 使隱式關系成為顯式和雙向關系 。翻譯自: https://www.javacodegeeks.com/2013/10/neo4j-making-implicit-relationships-explicit-bidirectional-relationships.html
intent隱式和顯式
總結
以上是生活随笔為你收集整理的intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科尔达服务101
- 下一篇: 腾讯云DDOS(ddos腾讯云清退)