我有一個帶有以下列的事件日誌的CSV:EventType
,UserId
,RecordId
(自動遞增的序列號)。我想導入Neo4j併爲每個EventType
(大約100個獨特類型)構建一個節點,然後使用關係分析路徑。爲了建立關係,我需要匹配所有的原始事件,並找到在路徑中的「下一個」事件,這意味着我需要與事件有相同UserId
和明年RecordId
比當前RecordId
(next RecordId > current RecordId
)大相匹配。 在Cypher中執行此操作的有效方法是什麼?不知何故,我想出了涉及笛卡爾產品的查詢,這些查詢非常緩慢。根據事件序列創建關係
0
A
回答
0
我想你不能避免笛卡爾乘積在這種情況下。但是,您可以
- 使它們儘可能小。
- 使用索引來提高查詢的速度。
除了使用EventType
爲節點標籤(「獨特型」),我強烈建議使用一個額外的Event
標籤的所有事件,以便您可以索引userId
值和recordId
值。
CREATE INDEX ON :Event(recordId)
CREATE INDEX ON :Event(userId)
我創建了一個小示例數據集:
CREATE
(e1:Event:Skating {userId: 1, recordId: 1}),
(e2:Event:Hiking {userId: 1, recordId: 2}),
(e3:Event:Mountaineering {userId: 1, recordId: 3})
獲得下一個recordId
,你需要滿足的是nextRecordId > currentRecordId
,也是nextRecordId
必須是最小的一個(爲recordId
來自一個自動遞增序列)。我們比連接使用MERGE
兩個事件(CREATE
也適用,但使用MERGE
可以確保我們避免創建重複邊緣)。這給出以下查詢:
MATCH (a:Event), (b:Event)
WHERE a.userId = b.userId
AND a.recordId < b.recordId
WITH a, min(b.recordId) AS bRecordId
MATCH (b {recordId: bRecordId})
MERGE (a)-[:NEXT]->(b)
此查詢爲所有用戶標識創建笛卡爾產品。只要用戶不參與數百個活動,笛卡爾產品的規模就不應該變大。需要注意的是,第一MATCH
使用這兩個指數(userId
和recordId
),而第二MATCH
使用上recordId
索引。
相關問題
- 1. 根據其他關係創建關係
- 2. 根據不是主鍵的列創建關係?
- 3. 根據系列條件創建新的熊貓列
- 4. 根據列值創建列
- 5. R - 根據id事件創建增量列
- 6. 創建關係數據庫
- 7. 根據秩條件創建Groupby列Python
- 8. 根據一系列標籤創建有意義的建議
- 9. 關聯創建事件
- 10. 在ActionScript3中創建事件序列
- 11. 創建關係
- 12. 創建關係
- 13. 創建關係
- 14. 創建關係
- 15. 如何根據neo4j.rb中的模型創建獨特的關係?
- 16. 性能:根據屬性ID在neo4j中創建關係
- 17. 根據這兩個表的PK創建一對一關係
- 18. 根據額外參數創建WCF服務的依賴關係
- 19. 如何根據與Perl的配對關係列表創建唯一集?
- 20. 根據關係參數排除關係
- 21. 根據一系列True/False條件動態創建二進制值列
- 22. 從關係數據(iOS)快速創建核心數據關係
- 23. 比較數據列表,根據條件創建新列表,Mathematica
- 24. 根據文件系統中存在的文件創建HTML
- 25. 根據db值創建動態關聯
- 26. OOP建築師一系列基於用戶創建事件
- 27. 根據條件克隆一些關係
- 28. 根據條件安裝依賴關係
- 29. 根據div數量創建一系列點按鈕
- 30. 根據事件
它運行速度非常慢。 理論上講,如果我把所有的事件放在一個平衡樹中,可以用nlogn的複雜度來完成。如果我爲每個用戶創建一個平衡樹的散列表並通過recordid命令樹節點。 –
如果你能寫一些代碼(如Java中)添加的關係,你可以實現一個解決方案,快哩 - 如你所說,你可以使用額外的數據結構,如哈希表和樹木。 –