2012-01-31 30 views
6

Tôi chỉ mới bắt đầu với neo4j và tôi hiểu các nguyên tắc của biểu đồ và mối quan hệ, nhưng tôi gặp một chút rắc rối với các cấu trúc nhất định mà tôi muốn tạo mô hình. Tôi muốn sử dụng nó trên một dự án ngôn ngữ lập trình và lưu trữ AST của tệp nguồn được phân tích cú pháp. Từ đó, tôi có kế hoạch bổ sung rất nhiều dữ liệu bổ sung và các mối quan hệ cho các nút để giúp phân tích và công cụ, nhưng AST cơ bản vẫn còn một chút khó khăn. Cách làm ngây thơ của cây là chỉ đơn giản là đi bộ AST và sao chép tất cả các nút trong cây đến nút trong neo4j, sử dụng các thuộc tính để theo dõi dữ liệu mã thông báo, vv và sau đó sử dụng mối quan hệ CHILD đến điểm cho các nút con. Vấn đề là khi sau này tôi muốn đi qua cây, tôi cần có khả năng làm đúng theo thứ tự của AST ban đầu, nhưng tôi không chắc chắn cách tốt nhất để làm điều đó.Lập mô hình cây có trật tự với neo4j

Tôi có hai cách tiếp cận cơ bản mà tôi đang nghĩ đến từ đỉnh đầu. Một là chỉ cần thêm một thuộc tính chỉ mục/thứ tự cho mỗi mối quan hệ CHILD. Người kia là có mối quan hệ ĐẦU TIÊN cho đứa trẻ đầu tiên và mối quan hệ TIẾP THEO giữa mỗi đứa trẻ để duy trì trật tự theo cách đó.

Đối với một trong các cách tiếp cận này, nó vẫn không có vẻ như có bất cứ điều gì ra khỏi hộp tôi có thể sử dụng để đi qua điều này theo thứ tự đúng. Tôi nghĩ rằng nếu tôi làm FIRST/TIẾP THEO, tôi có thể có được thứ tự đúng miễn là tôi buộc neo4j luôn luôn đi qua FIRST đầu tiên và làm một tìm kiếm đầu tiên chiều sâu. Liệu điều đó có hiệu quả? Có cách nào tốt hơn? Điều này có vẻ như một cái gì đó mà nên được xử lý dễ dàng hơn ra khỏi hộp.

CẬP NHẬT

Cuối cùng tôi quyết định sử dụng cả hai ý tưởng của tôi. Các nút con có mối quan hệ CHILD với một thuộc tính chỉ mục. Đứa con đầu tiên cũng có mối quan hệ FIRST_CHILD. Các nút anh chị em có một mối quan hệ NEXT_SIBLING để đưa ra thứ tự chính xác. Sau đó, traversal là dễ dàng:

//reusable traversal description 
final private TraversalDescription AST_TRAVERSAL = Traversal.description() 
    .depthFirst() 
    .expand(new OrderedByTypeExpander() 
     .add(RelType.FIRST_CHILD, Direction.OUTGOING) 
     .add(RelType.NEXT_SIBLING, Direction.OUTGOING)); 

và sau đó khi tôi thực sự cần thiết để bước đi trên cây tôi chỉ có thể làm

for(Path path : AST_TRAVERSAL.traverse(astRoot)){ 
    //do stuff here 
} 

Đối với trường hợp sử dụng của tôi, tôi không thực sự thay đổi cấu trúc cây chính nó sau khi tạo ra - Tôi chỉ thực hiện phân tích và thêm nhiều mối quan hệ và tài sản, vì vậy điều này rất dễ bảo trì. Nếu tôi phải sửa đổi nhiều hơn, nó có thể là một chút công việc, đặc biệt là nếu tôi muốn duy trì các số chỉ mục về quan hệ con. Vì vậy, đó có thể là một cái gì đó để xem xét cho người khác trong một tình huống tương tự.

Nếu tôi gặp phải điều gì đó dễ thay đổi hơn, tôi có thể thử các bộ sưu tập mà Peter Neubauer đề xuất và có thể chỉ cần tạo một lớp OrderedTreeNode trỏ tới một nút và sử dụng bộ sưu tập Danh sách cho trẻ em.

Trả lời

1

Russel, chúng tôi đang làm việc trên những thứ như vậy, có cây thời gian đã đặt trong các tác phẩm được cấu trúc dọc theo các dòng khác nhau từ NĂM-2012-> MONTH-01-> DAY-21-> VALUE123 và sẽ có thể có mối quan hệ TIẾP THEO giữa ví dụ THÁNG cùng năm.

Nếu không, nếu bạn làm điều này, hãy cân nhắc việc đóng góp hoặc điều tra nội dung trong số https://github.com/neo4j/graph-collections, đóng góp và thử nghiệm sẽ được đánh giá cao!

+0

cảm ơn, tôi đang tìm kiếm và tôi nghĩ rằng tôi có thể sử dụng một số công cụ này tại một số điểm. Bây giờ, bởi vì tôi không thực hiện nhiều sửa đổi cho các nút sau khi tạo, tôi nghĩ rằng tôi sẽ gắn bó với FIRST/NEXT, nhưng nếu tôi nhận được các yêu cầu phức tạp hơn, tôi chắc chắn sẽ phải thử . Một tài liệu ít hơn sẽ hữu ích, nhưng tôi hiểu nó là một công việc đang tiến triển và nó trông rất tuyệt vời cho đến nay, cảm ơn. –

1

Để tiện lợi hơn bất cứ ai tìm kiếm này hơn 2 năm sau đó, có cuối cùng là một thư viện hỗ trợ cây thời gian ra khỏi hộp (từ chối trách nhiệm: Tôi là một trong các tác giả):

https://github.com/graphaware/neo4j-timetree

+0

Tính năng này có hoạt động với Spring Data Neo4j không? – John

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