2012-10-30 21 views
5

Tôi đang phát triển một ứng dụng có thể hoạt động tốt với cơ sở dữ liệu đồ thị (Titan), ngoại trừ nó có vấn đề với đỉnh với nhiều cạnh, tức là supernodes."Supernodes" trong Titan

Liên kết siêu âm ở trên trỏ đến một bài đăng trên blog từ các tác giả của Titan, giải thích cách giải quyết vấn đề. Giải pháp dường như giảm số lượng đỉnh bằng cách lọc trên các cạnh.

Thật không may tôi muốn groupCount thuộc tính của cạnh hoặc đỉnh. Ví dụ: tôi có 1 triệu người dùng và mỗi người dùng thuộc về một quốc gia. Làm cách nào để có thể thực hiện nhanh groupCount để tìm ra số lượng người dùng ở mỗi quốc gia?

Những gì tôi đã cố gắng cho đến nay có thể được thể hiện trong kịch bản này công phu groovy:

g = TitanFactory.open('titan.properties') // Cassandra 
r = new Random(100) 
people = 1e6 

def newKey(g, name, type) { 
    return g 
     .makeType() 
     .name(name) 
     .simple() 
     .functional() 
     .indexed() 
     .dataType(type) 
     .makePropertyKey() 
} 

def newLabel(g, name, key) { 
    return g 
     .makeType() 
     .name(name) 
     .primaryKey(key) 
     .makeEdgeLabel() 
} 

country = newKey(g, 'country', String.class) 
newLabel(g, 'lives', country) 

g.stopTransaction(SUCCESS) 

root = g.addVertex() 
countries = ['AU', 'US', 'CN', 'NZ', 'UK', 'PL', 'RU', 'NL', 'FR', 'SP', 'IT'] 

(1..people).each { 
    country = countries[(r.nextFloat() * countries.size()).toInteger()] 
    g.startTransaction() 
    person = g.addVertex([name: 'John the #' + it]) 
    g.addEdge(g.getVertex(root.id), person, 'lives', [country: country]) 
    g.stopTransaction(SUCCESS) 
} 

t0 = new Date().time 

m = [:]  
root = g.getVertex(root.id) 
root.outE('lives').country.groupCount(m).iterate() 

t1 = new Date().time 

println "groupCount seconds: " + ((t1 - t0)/1000) 

Về cơ bản một nút gốc (vì lợi ích của Titan không có một "tất cả" các nút tra cứu), liên quan đến nhiều person qua các cạnh có thuộc tính country. Khi tôi chạy groupCount() trên 1 triệu đỉnh, phải mất hơn một phút.

Tôi nhận ra Titan có lẽ đang lặp qua từng cạnh và thu thập số lượng, nhưng có cách nào để làm cho điều này chạy nhanh hơn trong Titan hoặc bất kỳ cơ sở dữ liệu biểu đồ nào khác không? Chỉ số có thể được tính để nó không phải đi qua? Các chỉ mục của tôi có đúng không?

Trả lời

8

Nếu bạn đặt 'quốc gia' là primary key cho nhãn 'cuộc sống' và sau đó bạn có thể truy xuất tất cả mọi người cho một quốc gia cụ thể nhanh hơn. Tuy nhiên, trong trường hợp của bạn, bạn quan tâm đến số lượng nhóm yêu cầu tất cả các cạnh của nút gốc đó được truy lục để lặp lại chúng và gộp các quốc gia.

Do đó, truy vấn phân tích này phù hợp hơn với khung phân tích biểu đồ Faunus. Nó không đòi hỏi một đỉnh gốc khi nó thực hiện việc đếm số lượng nhóm theo cách quét cơ sở dữ liệu hoàn chỉnh và do đó tránh được vấn đề siêu nút. Faunus cũng sử dụng Gremlin là ngôn ngữ truy vấn vì vậy bạn chỉ phải sửa đổi truy vấn của bạn một chút:

g.V.country.groupCount.cap... 

HTH, Matthias

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