Apache AGE için en iyi performans uygulamaları: Azure HorizonDB için dizin oluşturma, AGE EXPLAIN ve veri yükü karşılaştırmaları (Önizleme)

Azure HorizonDB tarafından desteklenen Apache AGE, gelişmiş grafik işleme ve sorgulama desteği sağlar. Ancak, en iyi sorgu performansını elde etmek için dizin oluşturma ve veri yükleme için düşünceli bir strateji gerekir. Bu kılavuzda, son karşılaştırma sonuçlarına ve teknik içgörülere dayalı olarak bazı en iyi yöntemler özetlenmiştir.

Apache AGE'de İndeks

Dizin oluşturma, özellikle graf veritabanlarında sorgu performansını geliştirmek için çok önemlidir.

Varsayılan davranış

Varsayılan olarak Apache AGE, yeni oluşturulan grafikler için dizin oluşturmaz. Bu, sorgularınızın ve veri kümenizin doğasına göre dizinlerin açıkça oluşturulmasını gerektirir.

WHERE ifadesi

Apache AGE'de aşağıdaki sorgular farklı değerlendirilir:

SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer {Name:'Alice'}) RETURN n
 $$)
AS (n agtype);
SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer) WHERE n.Name='Alice' RETURN n
 $$)
AS (n agtype);

Dizin oluşturmanın tüm avantajlarından yararlanmak için, WHERE yan tümcesi olan ve olmayan sorgular tarafından hangi dizin türlerinin kullanıldığını anlamanız gerekir.

Apache AGE üzerinde EXPLAIN kullanımı

Standart SQL'in aksine, Cypher sorgularındaki EXPLAIN anahtar sözcüğü farklı bir sorgu biçimi gerektirir.

SELECT * FROM cypher('graph_name',
 $$
 EXPLAIN
 MATCH (n:Customer)
 WHERE n.Name='Alice'
 RETURN n
 $$)
AS (plan text);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..418.51 rows=43 width=32)
Filter: (agtype_access_operator(VARIADIC ARRAY[properties, '"Name"'::agtype]) = '"Alice"'::agtype)

WHERE yan tümcesi olmadan sorgu planlarının farklarını görmek için:

SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer {Name:'Alice'}) RETURN n
 $$)
AS (n agtype);
QUERY PLAN
---------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..396.56 rows=9 width=32)
Filter: (properties @> '{"Name": "Alice"}'::agtype)

Ortak dizin türleri

  • BTREE Dizini: Tam eşleşmeler ve aralık sorguları için geçerlidir. Kenar ve düğüm tablolarında ID, start_id ve end_id gibi sütunlarla kullanılması önerilir.
  • GIN Dizini: Özellikler sütununda anahtar-değer çiftleri için verimli aramalar sağlayan JSON alanları için kullanışlıdır.

Köşe ve kenar tabloları için dizinler oluşturmak için aşağıdaki komutları kullanın:

  • Köşe tablosu:

    CREATE INDEX ON graph_name."VLABEL" USING BTREE (id);
    CREATE INDEX ON graph_name."VLABEL" USING GIN (properties);
    
  • Edge tablosu:

    CREATE INDEX ON graph_name."ELABEL" USING BTREE (id);
    CREATE INDEX ON graph_name."ELABEL" USING GIN (properties);
    
    CREATE INDEX ON graph_name."ELABEL" USING BTREE (start_id);
    CREATE INDEX ON graph_name."ELABEL" USING BTREE (end_id);
    

Özelliklerde belirli bir anahtar değerini dizine ekleme

Hedeflenen sorgular için özellikler sütunundaki belirli anahtarlar için daha küçük, daha verimli bir BTREE dizini oluşturulabilir:

CREATE INDEX ON graph_name.label_name USING BTREE (agtype_access_operator(VARIADIC ARRAY[properties, '"KeyName"'::agtype]));

Bu yaklaşım gereksiz verilerin dizine konulmasını önleyerek verimliliği artırır.

EXPLAIN ile plan içgörülerini sorgulama

EXPLAIN anahtar sözcüğü sorguların dizinleri nasıl kullandığı gösterir. Tüm sorgular, özellikle WHERE yan tümcesi olmadan verilen dizinleri otomatik olarak kullanmaz. Dizin kullanımını doğrulamak ve sorguları uygun şekilde iyileştirmek için EXPLAIN kullanın.

Karşılaştırma gözlemleri

Son testler, dizin oluşturmanın sorgu performansı üzerindeki etkisini vurgular.

Dizine alınmış sorgular ile dizine alınmamış sorgular karşılaştırması

Bu bölümde, dizine alınan ve dizine alınmayan sorgular arasındaki performans farkları açıklanmıştır.

  • Sıralı taramalar, tabloların tamamını alan sorgular için dizin taramalarından daha iyi performans gösterir.
  • Dizin oluşturma, birleştirme sorgularının performansını önemli ölçüde artırır (örneğin, ilişki sayıları).

En iyi veri yükleme yöntemleri

Verimli veri yükleme, büyük veri kümeleri için çok önemlidir.

AGEFreighter kitaplığı, veri alımı için kolaylaştırılmış bir işlem sunar.

AGEFreighter ile veri yükleme

AGEFreighter, Verilerin Apache AGE'ye yüklenmesini kolaylaştırmak için tasarlanmış bir Python kitaplığıdır. CSV, Avro ve Parquet gibi çeşitli veri biçimlerini destekler ve AGE graflarına veri yüklemek için basit bir arabirim sağlar.

Ortam kurulumu

  • AGE etkinleştirilmiş bir Azure HorizonDB örneği oluşturun.
  • Şiir gibi Python bağımlılık yönetimi aracı önerilir. Python 3.9 veya üzeri yüklü olmalıdır.
  • AGEFreighter kitaplığı (AGEFreighter PyPi) bağımlılık olarak yüklenmelidir:
poetry add agefreighter

Karşılaştırmalar için CSV veri biçimini kullanma

Karşılaştırmalar için, AGE'ye veri yüklemek için bir CSV dosyası kullanılır. CSV biçimi yaygın olarak desteklenir ve kullanımı kolaydır, bu da veri yükleme görevleri için iyi bir seçimdir.

Veri kümesi yasal davalardan ve aralarındaki ilişkilerden oluştuğundan, giriş CSV dosyası aşağıdaki gibi yapılandırılır:

id,CaseID,start_vertex_type,end_CaseID,end_vertex_type
1,1005631,Case,5030916,Case
2,1005631,Case,5028652,Case
3,1005631,Case,996512,Case
4,1005631,Case,3413065,Case
5,1005631,Case,4912975,Case

Her satır iki vaka arasındaki bir ilişkiyi temsil eder. CaseID başlangıç durumu düğümüne, end_CaseID ise bağlantılı duruma başvurur.

Karşılaştırmalar için veri yükleme betiğini kullanma

Aşağıdaki Python betiği, veri kümesini AGE'ye yüklemek için kullanılmıştır. Farklı bir örnek için AGEFreighter PyPi'deki "CSVFreighter kullanımı" bölümüne de bakabilirsiniz.

await instance.load(
 graph_name="CaseGraphFull",
 start_v_label="Case",
 start_id="CaseID",
 start_props=[],
 edge_type="REF",
 edge_props=[],
 end_v_label="Case",
 end_id="end_CaseID",
 end_props=[],
 csv_path="./cases.csv",
 use_copy=True,
 drop_graph=True,
 create_graph=True,
 progress=True,
)

Gördüğünüz gibi, sağlanan csv dosyasındaki graph_name ve alanlar burada tanımlanmıştır. use_copy=True parametresi verimli veri yükleme sağlar. drop_graph=True ve create_graph=True parametreleri, yeni verileri yüklemeden önce yeni bir başlangıç olmasını sağlar.

Diğer veri kaynakları

AGEFreighter, veri biçimi gereksinimlerine göre uyarlanabilen MultiCSV, Avro, Parquet ve Azure Depolama gibi diğer biçimleri destekler. Daha fazla bilgi için bkz. PyPI üzerinde AGEFreighter.

Veri yükleme performansı karşılaştırmaları

  • Veri kümesi boyutu: 725.000 vaka, 2,8M ilişki.
  • Yükleme süresi: 83 saniye.

Verimli veri yükleme, büyük veri kümelerini etkili bir şekilde işlemek için gereklidir.

Note

Büyük dosyalar için uygun olsa da, hazırlık süresi nedeniyle bu işlem daha küçük veri kümeleri için daha az etkili olabilir.