Một phần biểu đồ của tôi được tạo bằng cách sử dụng kết hợp khổng lồ giữa hai bộ sưu tập lớn và tôi chạy nó mỗi khi tôi thêm tài liệu vào bộ sưu tập. Truy vấn được dựa trên older post.ArangoDB: Chèn làm hàm truy vấn bằng ví dụ
FOR fromItem IN fromCollection
FOR toItem IN toCollection
FILTER fromItem.fromAttributeValue == toItem.toAttributeValue
INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection
Việc này mất khoảng 55.000 giây để hoàn thành tập dữ liệu của tôi. Tôi hoàn toàn sẽ hoan nghênh các đề xuất để làm nhanh hơn.
Nhưng tôi có hai vấn đề liên quan:
- Tôi cần một upsert. Thông thường,
upsert
sẽ ổn, nhưng trong trường hợp này, vì tôi không có cách nào để biết chìa khóa ở phía trước, nó sẽ không giúp tôi. Để có được chìa khóa lên phía trước, tôi sẽ cần phải truy vấn bằng ví dụ để tìm chìa khóa của cạnh khác nhau, hiện tại. Điều đó có vẻ hợp lý miễn là nó không giết hiệu suất của tôi, nhưng tôi không biết làm thế nào trong AQL để xây dựng truy vấn của tôi có điều kiện để nó chèn một cạnh nếu cạnh tương đương chưa tồn tại, nhưng không có gì nếu cạnh tương đương không tồn tại. Tôi có thể làm cái này như thế nào? - Tôi cần phải chạy điều này mỗi khi dữ liệu được thêm vào bộ sưu tập. Tôi cần một cách để chạy điều này chỉ trên các dữ liệu mới nhất để nó không cố gắng tham gia toàn bộ bộ sưu tập. Làm thế nào tôi có thể viết AQL cho phép tôi chỉ tham gia các bản ghi mới được chèn vào? Chúng được thêm vào với Arangoimp và tôi không đảm bảo thứ tự chúng sẽ được cập nhật, vì vậy tôi không thể tạo các cạnh cùng lúc khi tạo các nút. Làm cách nào để tôi chỉ có thể tham gia dữ liệu mới? Tôi không muốn chi tiêu 55k giây mỗi khi một bản ghi được thêm vào.
Tôi đã thực hiện truy vấn trong cơ sở dữ liệu khác với cùng thách thức, làm cách nào để giảm kích thước của tập dữ liệu khi liên kết lại dữ liệu. Giải pháp làm việc cho tôi là thêm một trường được gọi là 'linked = false' trong cả bộ sưu tập' fromCollection' và 'toCollection'. –
... Sau đó, khi bạn chèn tài liệu mới vào bộ sưu tập, bạn luôn đặt 'liên kết' thành' false'. Khi bạn liên kết các tài liệu, bạn cũng quay lại và đặt 'linked' thành' true'. Để tăng tốc, bạn cũng sẽ muốn đặt chỉ mục trên 'liên kết'. Bạn sẽ thấy điều này làm tăng tốc độ xử lý của bạn mặc dù nó sẽ vẫn còn chậm trong lần đầu tiên bạn làm điều đó, vì mọi thứ sẽ có giá trị 'linked = false'. –
Bạn có thể viết một ứng dụng Foxx để làm điều đó cho bạn, tôi ghi lại một ví dụ ứng dụng Foxx cho câu hỏi của người khác, nó có sẵn [ở đây] (http://stackoverflow.com/questions/39897954/arangodb-aql-recursive-graph- traversal) trên StackOverflow. Bạn nên dành chút thời gian để tìm hiểu Foxx vì nó có thể tốt đẹp và nhanh chóng và một chức năng giống như những gì bạn mô tả là một trường hợp sử dụng hoàn hảo. Hàm này thậm chí không cần bất kỳ tham số nào, nó chỉ chạy và nó sẽ chỉ quét các bản ghi đó bằng 'linked = false'. –