我有一個分析用例,我用一系列不同的屬性將一堆節點堆放到Neo4j中。它們來自不同的系統和不同的表格,但是在各種節點類型中都有共享屬性(信息通過ETL過程)。高效的Cypher更新查詢以捕獲「已發現」關係
我想要做的就是查詢所有具有屬性(例如customer_id)的節點的圖並找到所有具有相同值的屬性的其他節點並在它們之間創建邊,捕獲任何任意匹配。
我根據源表標記節點期間的節點,我已經創建鏈接屬性的自動索引,並且我已經將標籤添加到具有公共屬性的節點,以便我可以將標籤索引放在它們上,但我沒有偶然發現正確的語法來有效地建立所有連接。
我想保留在Cypher中,因爲客戶可能會要求不同的觀點,所以我們可能會根據其他類型的匹配(如此「發現」的關係)發明新的邊緣,而不是滿足模式進入,然後能夠使用發現的邊來執行遍歷,回答您在關聯之前不能問的問題。
我的測試套件有900萬個節點,我迄今爲止所做的許多嘗試都表現不佳。
這是一個天真的嘗試,實際上對付少量的節點,但不能很好地擴展。你會如何處理這個問題?我認爲有一些方法可以高效地使用集合來完成此操作,但我還沒有制定出這種語法。
這是一個天真的嘗試,它適用於一小部分節點,但不能很好地擴展。
using periodic commit 100 match (a:CUST_ID_NODES), (b:CUST_ID_NODES) where a.customer_id=b.customer_id create unique (a)-[r:CUSTOMER_ID {customer_id: a.customer_id}]-(b);
謝謝,jjaderberg。我同意這樣做是最好的,但它假設我們理解可以被查詢的所有方式,我們不這麼做 - 或者至少我們不想限制它,所以我們最終會想要隨時添加新的關係。您的示例查詢看起來不錯,我會與它合作並報告回來。 – Vramin
我想你讓我走在正確的軌道上。如果我沒有弄錯,上面描述的查詢的確會創建一個新節點或超級節點,當它合併到_common_中時。我大部分都在工作,但我在最後的合併中錯過了一些東西。當我給_common_添加一個新標籤時,我可以查詢它,但是:COMMON關係不會被創建。我會在新回覆中粘貼我的內容 - 我已經填充了這個文本框。 – Vramin
@Vramin如果給出的答案之一適合你的問題,你可以接受它,如果沒有,你可以添加評論或澄清你的問題。如果你有跟進不明確的問題,最好單獨發佈;如果您發佈後續問題作爲答案(論壇風格),則沒有人能真正回答您。 – jjaderberg