2013-06-01 31 views
9

Vì vậy, tôi đã xem xét neo4j và tôi có thể sử dụng nó trong một dự án sắp tới vì mô hình dữ liệu của nó có thể phù hợp với dự án của tôi rất tốt. Tôi đã xem qua các tài liệu nhưng tôi vẫn cần câu trả lời cho câu hỏi này:neo4j: các mối quan hệ một chiều/hai hướng?

Tôi có thể đặt các mối quan hệ là một chiều không?

Dường như những người neo4j thích phim nên hãy tiếp tục với điều đó. Nếu tôi có biểu đồ như sau:

Actor A -> [:Acts in] -> Movie B 

thì hướng là hiển nhiên, vì các nút là các loại khác nhau.

Nhưng tôi thích phim kinh dị như vậy ...

Person A -> [:wants_to_kill] -> Person B 

Tôi cần mối quan hệ này là một chiều vì vậy nếu tôi truy vấn "Ai mà Blogger A muốn giết?" Tôi nhận được Người B, nếu tôi truy vấn "Ai là người B muốn giết?" Tôi không có gì cả.

Đôi khi tôi vẫn cần những mối quan hệ là hai hướng

Giống như:

Person A <-[:has_met] -> Person B 

... đó là hiển nhiên.

tài liệu nói:

Relationships are equally well traversed in either direction. This means that there is 
no need to add duplicate relationships in the opposite direction (with regard to 
traversal or performance). 

While relationships always have a direction, you can ignore the direction where it is 
not useful in your application. 

Vì vậy, tài liệu nói, mối quan hệ theo mặc định có một hướng và tôi có thể bỏ qua rằng nếu tôi muốn.

Bây giờ đây là nơi mà mọi thứ trở nên phức tạp:

xem xét đồ thị dưới đây (và lưu ý các mũi tên)

Person A <- [:wants_to_kill] -> Person B 
Person B -> [:wants_to_kill] -> Person C 
Person C -> [:wants_to_kill] -> Person A 

Nếu tôi bỏ qua Hướng dẫn cho tất cả [:wants_to_kill] tôi nhận được kết quả sai cho "Ai làm Người A/C muốn giết? " Nếu tôi biết cái nào tôi phải bỏ qua, tôi sẽ không thực hiện truy vấn.

Vì vậy, bằng cách nào đó tôi có thể đặt các mối quan hệ thành hai hướng (khi tạo chúng), hoặc tôi nên mô hình hóa điều này với hai mối quan hệ (giữa Người A & B)?

Trả lời

29

Mối quan hệ trong Neo4j luôn có hướng. Nếu ngữ nghĩa của loại mối quan hệ không kết hợp một hướng, ví dụ: has_met từ ví dụ của bạn, sau đó thực hành tốt nhất là áp dụng một hướng tùy ý khi tạo mối quan hệ. sau đó truy vấn được thực hiện bằng cách sử dụng "cả hai chiều" (không có "lớn hơn/nhỏ hơn so với" ký tự) ký hiệu trong cypher:

start ... match (a)-[:HAS_MET]-(b) .... 

Ngược lại, nếu ngữ nghĩa của một mối quan hệ không có một hướng đi như wants_to_kill của bạn , bạn cần phải sử dụng hai mối quan hệ để chỉ ra rằng a và b muốn giết cái kia và ngược lại.Đối với ví dụ trên, bạn cần phải có 4 mối quan hệ:

Person A -[:wants_to_kill]-> Person B 
Person B -[:wants_to_kill]-> Person A 
Person B -[:wants_to_kill]-> Person C 
Person C -[:wants_to_kill]-> Person A 

Để tìm tất cả người mà A muốn giết ngươi làm:

start a=node:node_auto_index(name='A') match a-[:wants_to_kill]->victims_of_a return victims_of_a 

Để tìm tất cả những người muốn giết A:

start a=node:node_auto_index(name='A') match murderer_of_a-[:wants_to_kill]->a return murderer_of_a 
+0

tại chỗ, cảm ơn! – joschua011

+3

Ngay cả sau hai năm, điều này vẫn cực kỳ có giá trị. Không thể tìm thấy câu trả lời này trong tài liệu. Nó rất tốt có thể ở trong đó nhưng có lẽ cách họ nói nó làm cho nó khó tìm. –

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