Làm thế nào để biểu diễn đồ thị có hướng với nhiều phụ huynh?


8

http://dirtsimple.org/2010/11/simplest-way-to-do-tree-basing-queries.html cung cấp một thuật toán để chèn và xóa khỏi Bảng đóng.

Tôi muốn mô hình hóa một cấu trúc dữ liệu tương tự, ngoại trừ các nút có thể có nhiều cha mẹ.

Được:

Biểu đồ số 1

Nếu chúng tôi loại bỏ, [B, C]tôi hy vọng sẽ kết thúc với:

Biểu đồ số 2

và nếu chúng ta loại bỏ nút, Btôi sẽ kết thúc bằng:

Biểu đồ số 3

Tuy nhiên, nếu bạn sử dụng thuật toán của tác giả để xóa các liên kết hoặc nút, bạn sẽ nhận thấy rằng nó gắn thẻ [D, C, 1]để xóa, điều này là không mong muốn.

Những gì tôi đã cố gắng cho đến nay

Tôi đã thử điều chỉnh cấu trúc dữ liệu ban đầu bằng cách thêm một referencescột cho biết có bao nhiêu cách để di chuyển giữa hai nút. Trong ví dụ trên, bạn có thể di chuyển từ Atới Choặc thông qua Bhoặc thông qua D. Ý tưởng này có thể đã được rằng khi Bđược gỡ bỏ, con đường từ Ađể Cđược lưu giữ và số lượng tài liệu tham khảo giảm từ 2 đến 1. It was nice về mặt lý thuyết, nhưng tôi không thể tìm ra cách để có được việc thực hiện làm việc và bây giờ tôi tự hỏi, nếu hoàn toàn có thể (cấu trúc dữ liệu có thể không chứa đủ thông tin để tìm ra hàng nào cần xóa).

Những gì tôi đang hỏi

Làm thế nào bạn thích ứng Bàn đóng cửa để hỗ trợ nhiều phụ huynh? Những cấu trúc dữ liệu thay thế nào bạn muốn giới thiệu? https://stackoverflow.com/q/4048151/14731 chứa một danh sách các cấu trúc dữ liệu như vậy, nhưng không rõ những hỗ trợ nào (hoặc tốt nhất cho) nhiều cha mẹ.


Vì vậy, những gì bạn đã cố gắng? Và referencescột là gì?
ypercubeᵀᴹ

Tôi không tin người ta sẽ điều chỉnh các bảng đóng trong kịch bản của bạn. Các bảng đóng là tốt cho nhiều ứng dụng dựa trên cây, nhưng câu hỏi này ám chỉ đến một loại DAG ít hạn chế hơn (Đồ thị theo chu kỳ có hướng). Đây là một chủ đề có thể phù hợp với luận án thạc sĩ và cũng như rất nhiều điều khi nói đến cơ sở dữ liệu, một giải pháp tối ưu sẽ phụ thuộc nhiều vào trường hợp sử dụng chính xác, cụ thể của bạn. Điều này hoặc điều này có thể giúp bạn bắt đầu.
Avarkx

Phần mềm db nào?
Neil McGuigan

@NeilMcGuigan, H2 và PostgreSQL mặc dù rõ ràng tôi thích giải pháp DB-agnellect.
Gili

Câu trả lời:


3

Thường tạo một bảng nút và bảng mối quan hệ. Các biểu đồ được điều hướng không thực sự phân cấp và chúng có thể có các vòng lặp khiến việc truy vấn khó hơn. Nhưng nếu bạn nghĩ rằng DAG là một cây tổng quát (Tức là một cây cho phép nhiều cha mẹ nhưng vẫn được phân cấp chặt chẽ) và một biểu đồ được định hướng là một DAG tổng quát (như DAG nhưng không phân cấp nghiêm ngặt) thì mọi thứ sẽ dễ dàng hơn.

Vì vậy, đối với một giải pháp PostgreQuery rất đơn giản, chúng ta có thể làm một cái gì đó như:

CREATE TABLE node (
    id serial primary key,
    payload jsonb not null
);

CREATE TABLE relationship (
    id serial primary key,
    relationship_type text not null,
    from_node int references node(id) not null,
    to_node int references node(id) not null,
    payload jsonb not null
);

Sau đó, bạn có thể truy vấn một cái gì đó như thế này:

with recursive dg as (
    select n.id as node_id, null::Int as parent, array[n.id] as path
      from node n
    union all
    select to_node, from_node, path || to_node
      FROM relationship
      JOIN dg on dg.node_id = from_node AND NOT from_node = ANY(path)
)
select * from dg;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.