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?