2013-12-09 25 views
6

Tôi có biểu đồ các thành viên và các mục mà họ đã xem.So sánh các giá trị mảng với cypher/neo4j

Dữ liệu này sẽ được sử dụng để đề xuất các mục dựa trên các mục mà các thành viên tương tự đã xem xét. Tôi muốn sắp xếp các mục dựa trên màu sắc của các mục tương tự. Các màu được lưu trữ trên các mục trong một mảng (["đỏ", "xanh", "xanh lục"]). Có cách nào trong cypher để so sánh mảng để xem có bao nhiêu yếu tố họ có điểm chung?

Trả lời

8

Với hai nút, n và m, mà giống như thế:

CREATE ({id: 1, color: ["red", "blue", "green", "yellow"]}) 
CREATE ({id: 2, color: ["red", "blue", "green", "white"]}) 

Bạn có thể làm một cái gì đó như thế này:

MATCH n, m 
WHERE n.id = 1 AND m.id = 2 
RETURN length(FILTER(x in n.color WHERE x in m.color)) 

Các FILTER chức năng lặp qua mảng n.color, ràng buộc giá trị hiện tại là x (tùy ý do tôi chọn, có thể khác nhau). Vị từ (x in m.color) được kiểm tra cho mỗi giá trị x và nếu nó được đánh giá là đúng, phần tử đó được đẩy vào mảng mới mà trả về FILTER. Bạn có thể để nó ở đó để xem giao điểm của hai mảng (đỏ, xanh dương và xanh lá cây trong trường hợp này), hoặc bọc nó trong hàm length để xem số lượng màu được chia sẻ giữa hai nút (3 trong trường hợp này) .

Kiểm tra các tài liệu LỌC đầy đủ ở đây: http://docs.neo4j.org/chunked/milestone/query-functions-collection.html#functions-filter

+1

1 cho câu trả lời tốt với lời giải thích, nhưng (vì câu trả lời giả định phiên bản 2.0, cũng có thể) sử dụng kết hợp với các đặc tính: 'MATCH (n {id: 1}) 'et cetera. – jjaderberg

+0

Ah vâng. Tôi đang sử dụng bản phát hành mốc 2.0 (M06) không hỗ trợ cú pháp đó, nhưng gọi tốt. –

+0

bạn đề cập đến 'length' ở cuối, nhưng' count' trong truy vấn không thực sự có ý nghĩa - nó sẽ chỉ trả lại số kết quả. –

Các vấn đề liên quan