Daha hızlı ve verimli grafik veritabanı performansı için Neo4j sorgu optimizasyonunda ustalaşın. Cypher, indeksleme, profil oluşturma ve gelişmiş optimizasyon yöntemlerini öğrenin.
Grafik Veritabanları: Neo4j Sorgu Optimizasyonu – Kapsamlı Bir Rehber
Grafik veritabanları, özellikle Neo4j, birbirine bağlı verileri yönetmek ve analiz etmek için giderek daha popüler hale geldi. Ancak, veri setleri büyüdükçe, verimli sorgu yürütme kritik hale gelir. Bu rehber, yüksek performanslı grafik uygulamaları oluşturmanızı sağlayacak Neo4j sorgu optimizasyon tekniklerine kapsamlı bir genel bakış sunmaktadır.
Sorgu Optimizasyonunun Önemini Anlamak
Uygun sorgu optimizasyonu olmadan, Neo4j sorguları yavaş ve kaynak yoğun hale gelebilir, bu da uygulama performansını ve ölçeklenebilirliğini etkiler. Optimizasyon, Cypher sorgu yürütmesini anlama, indeksleme stratejilerinden yararlanma ve performans profil oluşturma araçlarını kullanma kombinasyonunu içerir. Amaç, doğru sonuçlar sağlarken yürütme süresini ve kaynak tüketimini en aza indirmektir.
Sorgu Optimizasyonu Neden Önemlidir?
- İyileştirilmiş Performans: Daha hızlı sorgu yürütme, daha iyi uygulama yanıt süresi ve daha olumlu bir kullanıcı deneyimi sağlar.
- Azaltılmış Kaynak Tüketimi: Optimize edilmiş sorgular daha az CPU döngüsü, bellek ve disk G/Ç tüketerek altyapı maliyetlerini düşürür.
- Gelişmiş Ölçeklenebilirlik: Verimli sorgular, Neo4j veritabanınızın performans düşüşü olmadan daha büyük veri setlerini ve daha yüksek sorgu yüklerini işlemesine olanak tanır.
- Daha İyi Eşzamanlılık: Optimize edilmiş sorgular, kilitleme çakışmalarını ve çekişmeyi en aza indirerek eşzamanlılığı ve iş hacmini artırır.
Cypher Sorgu Dili Temelleri
Cypher, Neo4j'nin grafik desenlerini ve ilişkilerini ifade etmek için tasarlanmış bildirimsel sorgu dilidir. Cypher'ı anlamak, etkili sorgu optimizasyonuna yönelik ilk adımdır.
Temel Cypher Sözdizimi
İşte temel Cypher sözdizimi öğelerine kısa bir genel bakış:
- Düğümler (Nodes): Grafikteki varlıkları temsil eder. Parantez içine alınır:
(node)
. - İlişkiler (Relationships): Düğümler arasındaki bağlantıları temsil eder. Köşeli parantez içine alınır ve kısa çizgilerle ve oklarla bağlanır:
-[relationship]->
veya<-[relationship]-
veya-[relationship]-
. - Etiketler (Labels): Düğümleri kategorize eder. Düğüm değişkeninden sonra eklenir:
(node:Label)
. - Özellikler (Properties): Düğümler ve ilişkilerle ilişkili anahtar-değer çiftleri:
{property: 'value'}
. - Anahtar Kelimeler (Keywords):
MATCH
,WHERE
,RETURN
,CREATE
,DELETE
,SET
,MERGE
, vb. gibi.
Yaygın Cypher İfadeleri
- MATCH: Grafikteki desenleri bulmak için kullanılır.
MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WHERE a.name = 'Alice' RETURN b
- WHERE: Sonuçları koşullara göre filtreler.
MATCH (n:Product) WHERE n.price > 100 RETURN n
- RETURN: Sorgudan hangi verilerin döndürüleceğini belirtir.
MATCH (n:City) RETURN n.name, n.population
- CREATE: Yeni düğümler ve ilişkiler oluşturur.
CREATE (n:Person {name: 'Bob', age: 30})
- DELETE: Düğümleri ve ilişkileri kaldırır.
MATCH (n:OldNode) DELETE n
- SET: Düğümlerin ve ilişkilerin özelliklerini günceller.
MATCH (n:Product {name: 'Laptop'}) SET n.price = 1200
- MERGE: Mevcut bir düğümü veya ilişkiyi bulur ya da yoksa yenisini oluşturur. Idempotent (tekrarlanabilir) işlemler için kullanışlıdır.
MERGE (n:Country {name: 'Germany'})
- WITH: Birden çok
MATCH
ifadesini zincirlemeye ve ara sonuçları aktarmaya olanak tanır.MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WITH a, count(b) AS friendsCount WHERE friendsCount > 5 RETURN a.name, friendsCount
- ORDER BY: Sonuçları sıralar.
MATCH (n:Movie) RETURN n ORDER BY n.title
- LIMIT: Döndürülen sonuçların sayısını sınırlar.
MATCH (n:User) RETURN n LIMIT 10
- SKIP: Belirtilen sayıda sonucu atlar.
MATCH (n:Product) RETURN n SKIP 5 LIMIT 10
- UNION/UNION ALL: Birden çok sorgunun sonuçlarını birleştirir.
MATCH (n:Movie) WHERE n.genre = 'Action' RETURN n.title UNION ALL MATCH (n:Movie) WHERE n.genre = 'Comedy' RETURN n.title
- CALL: Saklı yordamları (stored procedures) veya kullanıcı tanımlı fonksiyonları (user-defined functions) yürütür.
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Neo4j Sorgu Yürütme Planı
Neo4j'nin sorguları nasıl yürüttüğünü anlamak, optimizasyon için çok önemlidir. Neo4j, verileri almak ve işlemek için en uygun yolu belirlemek üzere bir sorgu yürütme planı kullanır. Yürütme planını EXPLAIN
ve PROFILE
komutlarını kullanarak görüntüleyebilirsiniz.
EXPLAIN vs. PROFILE
- EXPLAIN: Sorguyu fiilen çalıştırmadan mantıksal yürütme planını gösterir. Neo4j'nin sorguyu yürütmek için atacağı adımları anlamaya yardımcı olur.
- PROFILE: Sorguyu yürütür ve işlenen satır sayısı, veritabanı isabetleri (database hits) ve her adım için yürütme süresi de dahil olmak üzere yürütme planı hakkında ayrıntılı istatistikler sağlar. Bu, performans darboğazlarını belirlemek için paha biçilmezdir.
Yürütme Planını Yorumlama
Yürütme planı, her biri belirli bir görevi yerine getiren bir dizi operatörden oluşur. Yaygın operatörler şunları içerir:
- NodeByLabelScan: Belirli bir etikete sahip tüm düğümleri tarar.
- IndexSeek: Özellik değerlerine göre düğümleri bulmak için bir indeks kullanır.
- Expand(All): Bağlı düğümleri bulmak için ilişkileri gezer.
- Filter: Sonuçlara bir filtre koşulu uygular.
- Projection: Sonuçlardan belirli özellikleri seçer.
- Sort: Sonuçları sıralar.
- Limit: Sonuçların sayısını kısıtlar.
Yürütme planını analiz etmek, tam düğüm taramaları veya gereksiz filtreleme gibi optimize edilebilecek verimsiz işlemleri ortaya çıkarabilir.
Örnek: Bir Yürütme Planını Analiz Etme
Aşağıdaki Cypher sorgusunu düşünün:
EXPLAIN MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
EXPLAIN
çıktısı, bir NodeByLabelScan
ve ardından bir Expand(All)
gösterebilir. Bu, Neo4j'nin FRIENDS_WITH
ilişkilerini gezmeden önce 'Alice'i bulmak için tüm Person
düğümlerini taradığını gösterir. name
özelliği üzerinde bir indeks olmadan bu verimsizdir.
PROFILE MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
PROFILE
komutunu çalıştırmak, her işlemde harcanan zamanı ve veritabanı isabet sayısını ortaya koyarak yürütme istatistikleri sağlayacak ve darboğazı daha da teyit edecektir.
İndeksleme Stratejileri
İndeksler, Neo4j'nin düğümleri ve ilişkileri özellik değerlerine göre hızlı bir şekilde bulmasını sağlayarak sorgu performansını optimize etmek için çok önemlidir. İndeksler olmadan, Neo4j genellikle büyük veri setleri için yavaş olan tam taramalara başvurur.
Neo4j'deki İndeks Türleri
- B-ağacı İndeksleri: Eşitlik ve aralık sorguları için uygun olan standart indeks türüdür. Benzersiz kısıtlamalar için otomatik olarak veya
CREATE INDEX
komutu kullanılarak manuel olarak oluşturulur. - Tam Metin İndeksleri: Anahtar kelimeler ve ifadeler kullanarak metin verilerinde arama yapmak için tasarlanmıştır.
db.index.fulltext.createNodeIndex
veyadb.index.fulltext.createRelationshipIndex
yordamı kullanılarak oluşturulur. - Nokta İndeksleri: Coğrafi koordinatlara dayalı verimli sorgulamaya olanak tanıyan uzamsal veriler için optimize edilmiştir.
db.index.point.createNodeIndex
veyadb.index.point.createRelationshipIndex
yordamı kullanılarak oluşturulur. - Aralık İndeksleri: Özellikle aralık sorguları için optimize edilmiş olup, belirli iş yükleri için B-ağacı indekslerine göre performans iyileştirmeleri sunar. Neo4j 5.7 ve sonraki sürümlerde mevcuttur.
İndeks Oluşturma ve Yönetme
Cypher komutlarını kullanarak indeksler oluşturabilirsiniz:
B-ağacı İndeksi:
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
Bileşik İndeks:
CREATE INDEX PersonNameAge FOR (n:Person) ON (n.name, n.age)
Tam Metin İndeksi:
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Nokta İndeksi:
CALL db.index.point.createNodeIndex("LocationIndex", ["Venue"], ["latitude", "longitude"], {spatial.wgs-84: true})
Mevcut indeksleri SHOW INDEXES
komutunu kullanarak listeleyebilirsiniz:
SHOW INDEXES
Ve DROP INDEX
komutunu kullanarak indeksleri silebilirsiniz:
DROP INDEX PersonName
İndeksleme için En İyi Uygulamalar
- Sık sorgulanan özellikleri indeksleyin:
WHERE
ifadelerinde veMATCH
desenlerinde kullanılan özellikleri belirleyin. - Birden çok özellik için bileşik indeksler kullanın: Birden çok özellikte sık sık birlikte sorgulama yapıyorsanız, bir bileşik indeks oluşturun.
- Aşırı indekslemeden kaçının: Çok fazla indeks, yazma işlemlerini yavaşlatabilir. Yalnızca sorgularda gerçekten kullanılan özellikleri indeksleyin.
- Özelliklerin kardinalitesini göz önünde bulundurun: İndeksler, yüksek kardinaliteye (yani, çok sayıda farklı değere) sahip özellikler için daha etkilidir.
- İndeks kullanımını izleyin: Sorgularınız tarafından indekslerin kullanılıp kullanılmadığını kontrol etmek için
PROFILE
komutunu kullanın. - İndeksleri periyodik olarak yeniden oluşturun: Zamanla, indeksler parçalanabilir. Bunları yeniden oluşturmak performansı artırabilir.
Örnek: Performans için İndeksleme
Person
düğümleri ve FRIENDS_WITH
ilişkileri olan bir sosyal ağ grafiği düşünün. Belirli bir kişinin arkadaşlarını isme göre sık sık sorguluyorsanız, Person
düğümünün name
özelliğine bir indeks oluşturmak performansı önemli ölçüde artırabilir.
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
İndeksi oluşturduktan sonra, aşağıdaki sorgu çok daha hızlı çalışacaktır:
MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
İndeksi oluşturmadan önce ve sonra PROFILE
kullanmak performans artışını gösterecektir.
Cypher Sorgu Optimizasyon Teknikleri
İndekslemeye ek olarak, birkaç Cypher sorgu optimizasyon tekniği performansı artırabilir.
1. Doğru MATCH Desenini Kullanma
MATCH
deseninizdeki öğelerin sırası performansı önemli ölçüde etkileyebilir. İşlenmesi gereken düğüm ve ilişki sayısını azaltmak için en seçici kriterlerle başlayın.
Verimsiz:
MATCH (a)-[:RELATED_TO]->(b:Product) WHERE b.category = 'Electronics' AND a.city = 'London' RETURN a, b
Optimize Edilmiş:
MATCH (b:Product {category: 'Electronics'})<-[:RELATED_TO]-(a {city: 'London'}) RETURN a, b
Optimize edilmiş versiyonda, category
özelliğine sahip Product
düğümüyle başlıyoruz, bu da muhtemelen tüm düğümleri tarayıp ardından şehre göre filtrelemekten daha seçicidir.
2. Veri Aktarımını En Aza İndirme
Gereksiz verileri döndürmekten kaçının. RETURN
ifadesinde yalnızca ihtiyacınız olan özellikleri seçin.
Verimsiz:
MATCH (n:User {country: 'USA'}) RETURN n
Optimize Edilmiş:
MATCH (n:User {country: 'USA'}) RETURN n.name, n.email
Yalnızca name
ve email
özelliklerini döndürmek, aktarılan veri miktarını azaltarak performansı artırır.
3. Ara Sonuçlar için WITH Kullanma
WITH
ifadesi, birden çok MATCH
ifadesini zincirlemenize ve ara sonuçları aktarmanıza olanak tanır. Bu, karmaşık sorguları daha küçük, daha yönetilebilir adımlara ayırmak için yararlı olabilir.
Örnek: Sıklıkla birlikte satın alınan tüm ürünleri bulun.
MATCH (o:Order)-[:CONTAINS]->(p:Product)
WITH o, collect(p) AS products
WHERE size(products) > 1
UNWIND products AS product1
UNWIND products AS product2
WHERE id(product1) < id(product2)
WITH product1, product2, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
RETURN product1.name, product2.name, co_purchases
WITH
ifadesi, her siparişteki ürünleri toplamamıza, birden fazla ürünü olan siparişleri filtrelememize ve ardından farklı ürünler arasındaki birlikte satın almaları bulmamıza olanak tanır.
4. Parametreli Sorguları Kullanma
Parametreli sorgular, Cypher enjeksiyon saldırılarını önler ve Neo4j'nin sorgu yürütme planını yeniden kullanmasına izin vererek performansı artırır. Değerleri doğrudan sorgu dizesine gömmek yerine parametreler kullanın.
Örnek (Neo4j sürücülerini kullanarak):
session.run("MATCH (n:Person {name: $name}) RETURN n", {name: 'Alice'})
Burada, $name
sorguya geçirilen bir parametredir. Bu, Neo4j'nin sorgu yürütme planını önbelleğe almasına ve farklı name
değerleri için yeniden kullanmasına olanak tanır.
5. Kartezyen Çarpımlardan Kaçınma
Kartezyen çarpımlar, bir sorguda birden çok bağımsız MATCH
ifadeniz olduğunda meydana gelir. Bu, sorgu yürütmeyi önemli ölçüde yavaşlatabilecek çok sayıda gereksiz kombinasyonun oluşturulmasına yol açabilir. MATCH
ifadelerinizin birbiriyle ilişkili olduğundan emin olun.
Verimsiz:
MATCH (a:Person {city: 'London'})
MATCH (b:Product {category: 'Electronics'})
RETURN a, b
Optimize Edilmiş (Person ve Product arasında bir ilişki varsa):
MATCH (a:Person {city: 'London'})-[:PURCHASED]->(b:Product {category: 'Electronics'})
RETURN a, b
Optimize edilmiş versiyonda, Person
ve Product
düğümlerini bağlamak için bir ilişki (PURCHASED
) kullanarak Kartezyen çarpımdan kaçınıyoruz.
6. APOC Prosedürlerini ve Fonksiyonlarını Kullanma
APOC (Awesome Procedures On Cypher) kütüphanesi, Cypher'ın yeteneklerini artırabilen ve performansı iyileştirebilen bir dizi faydalı prosedür ve fonksiyon sağlar. APOC, veri içe/dışa aktarma, grafik yeniden düzenleme ve daha fazlası için işlevsellikler içerir.
Örnek: Toplu işleme için apoc.periodic.iterate
kullanma
CALL apoc.periodic.iterate(
"MATCH (n:OldNode) RETURN n",
"CREATE (newNode:NewNode) SET newNode = n.properties WITH n DELETE n",
{batchSize: 1000, parallel: true}
)
Bu örnek, verileri OldNode
'dan NewNode
'a toplu halde taşımak için apoc.periodic.iterate
kullanımını göstermektedir. Bu, tüm düğümleri tek bir işlemde işlemekten çok daha verimlidir.
7. Veritabanı Yapılandırmasını Göz Önünde Bulundurma
Neo4j'nin yapılandırması da sorgu performansını etkileyebilir. Anahtar yapılandırmalar şunları içerir:
- Yığın Boyutu (Heap Size): Neo4j'ye yeterli yığın belleği ayırın.
dbms.memory.heap.max_size
ayarını kullanın. - Sayfa Önbelleği (Page Cache): Sayfa önbelleği, sık erişilen verileri bellekte saklar. Daha iyi performans için sayfa önbelleği boyutunu (
dbms.memory.pagecache.size
) artırın. - İşlem Günlüğü (Transaction Logging): Performans ve veri dayanıklılığını dengelemek için işlem günlüğü ayarlarını yapın.
Gelişmiş Optimizasyon Teknikleri
Karmaşık grafik uygulamaları için daha gelişmiş optimizasyon teknikleri gerekebilir.
1. Grafik Veri Modelleme
Grafik verilerinizi modelleme şekliniz, sorgu performansı üzerinde önemli bir etkiye sahip olabilir. Aşağıdaki ilkeleri göz önünde bulundurun:
- Doğru düğüm ve ilişki türlerini seçin: Grafik şemanızı, veri alanınızdaki ilişkileri ve varlıkları yansıtacak şekilde tasarlayın.
- Etiketleri etkili bir şekilde kullanın: Düğümleri ve ilişkileri kategorize etmek için etiketler kullanın. Bu, Neo4j'nin düğümleri türlerine göre hızla filtrelemesini sağlar.
- Aşırı özellik kullanımından kaçının: Özellikler yararlı olsa da, aşırı kullanım sorgu performansını yavaşlatabilir. Sık sorgulanan verileri temsil etmek için ilişkiler kullanmayı düşünün.
- Verileri denormalize edin: Bazı durumlarda, verileri denormalize etmek, birleştirme ihtiyacını azaltarak sorgu performansını artırabilir. Ancak, veri fazlalığına ve tutarlılığına dikkat edin.
2. Saklı Yordamları ve Kullanıcı Tanımlı Fonksiyonları Kullanma
Saklı yordamlar ve kullanıcı tanımlı fonksiyonlar (UDF'ler), karmaşık mantığı kapsüllemenize ve doğrudan Neo4j veritabanı içinde yürütmenize olanak tanır. Bu, ağ yükünü azaltarak ve Neo4j'nin kodun yürütülmesini optimize etmesine izin vererek performansı artırabilir.
Örnek (Java'da bir UDF oluşturma):
@Procedure(name = "custom.distance", mode = Mode.READ)
@Description("Calculates the distance between two points on Earth.")
public Double distance(@Name("lat1") Double lat1, @Name("lon1") Double lon1,
@Name("lat2") Double lat2, @Name("lon2") Double lon2) {
// Implementation of the distance calculation
return calculateDistance(lat1, lon1, lat2, lon2);
}
Daha sonra UDF'yi Cypher'dan çağırabilirsiniz:
RETURN custom.distance(34.0522, -118.2437, 40.7128, -74.0060) AS distance
3. Grafik Algoritmalarından Yararlanma
Neo4j, PageRank, en kısa yol ve topluluk tespiti gibi çeşitli grafik algoritmaları için yerleşik destek sağlar. Bu algoritmalar, ilişkileri analiz etmek ve grafik verilerinizden öngörüler çıkarmak için kullanılabilir.
Örnek: PageRank Hesaplama
CALL algo.pageRank.stream('Person', 'FRIENDS_WITH', {iterations:20, dampingFactor:0.85})
YIELD nodeId, score
RETURN nodeId, score
ORDER BY score DESC
LIMIT 10
4. Performans İzleme ve Ayarlama
Neo4j veritabanınızın performansını sürekli olarak izleyin ve iyileştirme alanlarını belirleyin. Aşağıdaki araçları ve teknikleri kullanın:
- Neo4j Browser: Sorguları yürütmek ve performansı analiz etmek için grafiksel bir arayüz sağlar.
- Neo4j Bloom: Grafik verilerinizi görselleştirmenize ve etkileşimde bulunmanıza olanak tanıyan bir grafik keşif aracıdır.
- Neo4j Monitoring: Sorgu yürütme süresi, CPU kullanımı, bellek kullanımı ve disk G/Ç gibi temel metrikleri izleyin.
- Neo4j Logları: Hatalar ve uyarılar için Neo4j günlüklerini analiz edin.
- Sorguları düzenli olarak gözden geçirin ve optimize edin: Yavaş sorguları belirleyin ve bu kılavuzda açıklanan optimizasyon tekniklerini uygulayın.
Gerçek Dünya Örnekleri
Neo4j sorgu optimizasyonunun bazı gerçek dünya örneklerini inceleyelim.
1. E-ticaret Tavsiye Motoru
Bir e-ticaret platformu, bir tavsiye motoru oluşturmak için Neo4j kullanır. Grafik, User
düğümleri, Product
düğümleri ve PURCHASED
ilişkilerinden oluşur. Platform, sık sık birlikte satın alınan ürünleri tavsiye etmek istiyor.
Başlangıç Sorgusu (Yavaş):
MATCH (u:User)-[:PURCHASED]->(p1:Product), (u)-[:PURCHASED]->(p2:Product)
WHERE p1 <> p2
RETURN p1.name, p2.name, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
Optimize Edilmiş Sorgu (Hızlı):
MATCH (o:Order)-[:CONTAINS]->(p:Product)
WITH o, collect(p) AS products
WHERE size(products) > 1
UNWIND products AS product1
UNWIND products AS product2
WHERE id(product1) < id(product2)
WITH product1, product2, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
RETURN product1.name, product2.name, co_purchases
Optimize edilmiş sorguda, her siparişteki ürünleri toplamak ve ardından farklı ürünler arasındaki birlikte satın almaları bulmak için WITH
ifadesini kullanırız. Bu, satın alınan tüm ürünler arasında bir Kartezyen çarpım oluşturan başlangıç sorgusundan çok daha verimlidir.
2. Sosyal Ağ Analizi
Bir sosyal ağ, kullanıcılar arasındaki bağlantıları analiz etmek için Neo4j kullanır. Grafik, Person
düğümleri ve FRIENDS_WITH
ilişkilerinden oluşur. Platform, ağdaki etkileyicileri (influencer) bulmak istiyor.
Başlangıç Sorgusu (Yavaş):
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
RETURN p.name, count(f) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
Optimize Edilmiş Sorgu (Hızlı):
MATCH (p:Person)
RETURN p.name, size((p)-[:FRIENDS_WITH]->()) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
Optimize edilmiş sorguda, arkadaş sayısını doğrudan saymak için size()
fonksiyonunu kullanırız. Bu, tüm FRIENDS_WITH
ilişkilerini gezmeyi gerektiren başlangıç sorgusundan daha verimlidir.
Ayrıca, Person
etiketi üzerinde bir indeks oluşturmak, başlangıçtaki düğüm aramasını hızlandıracaktır:
CREATE INDEX PersonLabel FOR (p:Person) ON (p)
3. Bilgi Grafiği Araması
Bir bilgi grafiği, çeşitli varlıklar ve ilişkileri hakkında bilgi depolamak için Neo4j kullanır. Platform, ilgili varlıkları bulmak için bir arama arayüzü sağlamak istiyor.
Başlangıç Sorgusu (Yavaş):
MATCH (e1)-[:RELATED_TO*]->(e2)
WHERE e1.name = 'Neo4j'
RETURN e2.name
Optimize Edilmiş Sorgu (Hızlı):
MATCH (e1 {name: 'Neo4j'})-[:RELATED_TO*1..3]->(e2)
RETURN e2.name
Optimize edilmiş sorguda, ilişki geçişinin derinliğini (*1..3
) belirtiyoruz, bu da geçilmesi gereken ilişki sayısını sınırlar. Bu, olası tüm ilişkileri geçen başlangıç sorgusundan daha verimlidir.
Ayrıca, `name` özelliği üzerinde bir tam metin indeksi kullanmak, başlangıçtaki düğüm aramasını hızlandırabilir:
CALL db.index.fulltext.createNodeIndex("EntityNameIndex", ["Entity"], ["name"])
Sonuç
Neo4j sorgu optimizasyonu, yüksek performanslı grafik uygulamaları oluşturmak için esastır. Cypher sorgu yürütmesini anlayarak, indeksleme stratejilerinden yararlanarak, performans profil oluşturma araçlarını kullanarak ve çeşitli optimizasyon tekniklerini uygulayarak sorgularınızın hızını ve verimliliğini önemli ölçüde artırabilirsiniz. Veritabanınızın performansını sürekli olarak izlemeyi ve veri ve sorgu iş yükleriniz geliştikçe optimizasyon stratejilerinizi ayarlamayı unutmayın. Bu rehber, Neo4j sorgu optimizasyonunda ustalaşmak ve ölçeklenebilir ve performanslı grafik uygulamaları oluşturmak için sağlam bir temel sağlar.
Bu teknikleri uygulayarak, Neo4j grafik veritabanınızın optimum performans sunmasını ve kuruluşunuz için değerli bir kaynak sağlamasını sağlayabilirsiniz.