日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Neo4j:使隐式关系成为显式和双向关系

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Neo4j:使隐式关系成为显式和双向关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近,我閱讀了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次,如果我們以Mark和Dave為例,我們可以看到原因:

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

總結

以上是生活随笔為你收集整理的Neo4j:使隐式关系成为显式和双向关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。