2015-01-07 35 views
5

Tôi có một tập hợp các dữ liệu cho một cây gia đình trong Neo4J và đang cố gắng xây dựng một truy vấn Cypher đó tạo ra một dữ liệu JSON thiết lập tương tự như sau:Tạo Tree Gia đình có Neo4J

{Name: "Bob", 
     parents: [ 
      {Name: "Roger", 
      parents: [ 
       Name: "Robert", 
       Name: "Jessica" 
      ]}, 
      {Name: "Susan", 
      parents: [ 
       Name: "George", 
       Name: "Susan" 
      ]} 
     ]} 

đồ thị của tôi có một mối quan hệ của PHỤ HUYNH giữa các nút THÀNH VIÊN (tức là MATCH (p.Member) - [: PHỤ HUYNH] -> (c.Member)). Tôi thấy Nested has_many relationships in cypherneo4j cypher nested collect mà kết thúc lên nhóm tất cả các bậc cha mẹ cùng nhau cho nút con chính tôi đang tìm kiếm.

Thêm một số sự rõ ràng dựa trên phản hồi:

Mọi thành viên đều có số nhận dạng duy nhất. Các công đoàn hiện đang liên kết với mối quan hệ PARENT. Tất cả mọi thứ được lập chỉ mục để hiệu suất sẽ không bị ảnh hưởng. Khi tôi chạy một truy vấn để lấy lại biểu đồ nút, tôi nhận được kết quả mà tôi mong đợi. Tôi đang cố gắng trả lại một đầu ra mà tôi có thể sử dụng cho mục đích trực quan với D3. Lý tưởng nhất điều này sẽ được thực hiện với một truy vấn Cypher như tôi đang sử dụng API để truy cập neo4j từ giao diện người dùng đang được xây dựng.

Thêm một truy vấn mẫu:

MATCH (p:Person)-[:PARENT*1..5]->(c:Person) 
WHERE c.FirstName = 'Bob' 
RETURN p.FirstName, c.FirstName 

Truy vấn này trả về một danh sách mỗi phụ huynh cho năm thế hệ, nhưng thay vì hiển thị hệ thống phân cấp, nó niêm yết 'Bob' như đứa trẻ đối với từng mối quan hệ. Có một truy vấn Cypher mà sẽ hiển thị mỗi mối quan hệ trong dữ liệu ít nhất? Tôi có thể định dạng nó như tôi cần phải từ đó ...

+0

Thông tin thêm xin vui lòng; bạn đang sử dụng REST API hay một DB nhúng? Nếu bạn đang sử dụng API REST, vấn đề của bạn có thể được đơn giản hóa thành nhiệm vụ chuyển đổi JSON mà API REST tách ra, vào cấu trúc này mà bạn đang tìm kiếm. http://neo4j.com/docs/stable/rest-api.html – FrobberOfBits

Trả lời

4

Bạn cũng có thể có một cái nhìn tại Rik van Bruggens Blog on his family data:

Về truy vấn của bạn

Bạn đã tạo mẫu đường dẫn tại đây: (p:Person)-[:PARENT*1..5]->(c:Person) bạn có thể gán cho biến số tree và sau đó hoạt động trên biến đó, ví dụ: trả lại cây, hoặc nodes(tree) hoặc rels(tree) hoặc vận hành trên bộ sưu tập mà theo những cách khác:

MATCH tree = (p:Person)-[:PARENT*1..5]->(c:Person) 
WHERE c.FirstName = 'Bob' 
RETURN nodes(tree), rels(tree), tree, length(tree), 
     [n in nodes(tree) | n.FirstName] as names 

Xem thêm các thẻ tham khảo cypher: http://neo4j.com/docs/stable/cypher-refcard và đào tạo trực tuyến http://neo4j.com/online-training để tìm hiểu thêm về Cypher.

Đừng quên

create index on :Person(FirstName); 
2

Tôi muốn đề nghị xây dựng một phương pháp để làm phẳng ra dữ liệu của bạn vào một mảng. Nếu họ các đối tượng không có UUIDs bạn có lẽ sẽ muốn cung cấp cho họ ID khi bạn làm phẳng và sau đó có một phím PARENT_ID cho mỗi bản ghi.

Sau đó bạn có thể chạy nó như một tập hợp của các truy vấn cypher (hoặc làm cho nhiều yêu cầu để REST API truy vấn, hoặc sử dụng các API REST batch) hoặc cách khác đổ dữ liệu để CSV và sử dụng lệnh cypher của LOAD CSV để nạp các đối tượng.

Một ví dụ lệnh cypher với params sẽ là:

CREATE (:Member {uuid: {uuid}, name: {name}} 

Và sau đó chạy qua danh sách một lần nữa với các ID cha mẹ và con:

MATCH (m1:Member {uuid: {uuid1}}), (m2:Member {uuid: {uuid2}}) 
CREATE m1<-[:PARENT]-m2 

Hãy chắc chắn để có một chỉ mục trên ID cho các thành viên!

+0

Điều này gần với những gì tôi đang tìm kiếm. Không có cách nào để tạo tập hợp thông qua một truy vấn đơn lẻ? Nói rằng tôi muốn nhìn thấy cây trong bốn hoặc năm thế hệ từ một người nhất định. Tôi có thể lấy đồ thị để hiển thị dữ liệu - tôi chỉ cần một cách để biến nó thành cypher nếu có thể. Nếu không, tôi sẽ phải gắn bó với dữ liệu thô trả về từ truy vấn cơ sở và phải xử lý nó thành định dạng mà tôi đang tìm kiếm. – OpenDataAlex

+0

Nó có thể có thể để có được nó bằng cách sử dụng chỉ cypher, nhưng tôi nghi ngờ nó sẽ không có giá trị nỗ lực. –

+0

Ồ, xin lỗi, tôi đã đọc sai. Tôi nghĩ rằng bạn muốn lấy JSON và biến nó thành một cơ sở dữ liệu neo4j với cypher, nhưng bạn muốn theo cách khác xung quanh –

2

dữ liệu phả hệ có thể tuân thủ các tiêu chuẩn GEDCOM và bao gồm hai loại nút: Person và Union. Nút Person có số nhận dạng và thông tin nhân khẩu học thông thường. Các nút Union có union_id và sự thật về union. Trong GEDCOM, gia đình là một yếu tố thứ ba mang hai người này lại với nhau. Nhưng trong Neo4j, tôi thấy nó phù hợp để bao gồm union_id trong các nút Person. Tôi đã sử dụng 5 mối quan hệ: cha, mẹ, chồng, vợ và con. Gia đình sau đó là hai cha mẹ với một vector bên trong và mỗi đứa trẻ với một vector bên ngoài. Hình ảnh minh họa điều này. Điều này rất thuận tiện cho việc hình dung các kết nối và tạo ra các giả thuyết. Ví dụ, xem xét hình ảnh đính kèm và tổ tiên của tôi Edward G Campbell, sản phẩm của công đoàn năm 1917, nơi ba anh em kết hôn với ba chị em gái từ công đoàn 8944 và hai chị em Gaither đã kết hôn từ công đoàn 2945. Ngoài ra, ở phía trên bên trái, Mahala Campbell kết hôn với cô như thế nào anh trai cùng cha John Greer Armstrong. Bên cạnh Mahala là một Elizabeth Campbell được kết nối bằng hôn nhân với Campbell khác, nhưng có thể liên quan trực tiếp đến họ. Tương tự, bạn có thể đưa ra giả thuyết về Rachael Jacobs ở phía trên bên phải và cách cô ấy có thể liên hệ với các Jacobs khác. Notice the query. From the few initial nodes visualized, you can click to open others. tôi sử dụng chèn số lượng lớn mà có thể cư ~ 30000 nút Person và ~ 100.000 mối quan hệ chỉ trong vòng một phút.Tôi có một hàm .NET nhỏ trả về JSon từ một dataview; giải pháp chung này hoạt động với bất kỳ dataview nào để có thể mở rộng. Tôi hiện đang làm việc trên thêm dữ liệu khác, chẳng hạn như địa điểm (lat/long), tài liệu (đặc biệt là liên kết folks, chẳng hạn như một điều tra dân số) vv

0

Cách duy nhất tôi đã tìm thấy cho đến nay để có được những dữ liệu tôi đang tìm kiếm là để thực sự trở lại với thông tin mối quan hệ, như vậy:

MATCH ft = (person {firstName: 'Bob'})<-[:PARENT]-(p:Person) 
RETURN EXTRACT(n in nodes(ft) | {firstName: n.firstName}) as parentage 
ORDER BY length(ft); 

Mà sẽ trả về một tập dữ liệu tôi sau đó có thể morph:

["Bob", "Roger"] 
["Bob", "Susan"] 
["Bob", "Roger", "Robert"] 
["Bob", "Susan", "George"] 
["Bob", "Roger", "Jessica"] 
["Bob", "Susan", "Susan"] 
+0

Tôi đã viết câu trả lời này trong khi Michael đang viết :) Cả hai đều trên cùng một đường đua để đưa ra câu trả lời giải quyết cho anh ta. – OpenDataAlex

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