Astronomical Data Query Language: ADQL¶
Astronomical Data Query Language (ADQL), Uluslararası Sanal Gözlemevleri Birliği (IVOA) tarafından sanal gözlemevi (VO) servislerine gönderilen astronomiye özgü sorguları için kullanılan, yapısal sorgulama dilinin (SQL) özelleştirilmiş bir versiyonudur. IVOA, astronomi verilerine erişmek için çeşitli standartlaştırılmış protokoller geliştirmiştir. Örnek olarak görüntü ve tayfsal verilere erişim için için kullanılan Basit Görüntü Erişimi (Simple Image Access, SIA) ve Basit Tayfsal Veri Erişimi (Simple Spectral Access, SSA) protokolleri verilebilir. Bu protokoller aracılığıyla veri sorgulamak ve farklı VO servislerinin sorgu karmaşıklığına, astronomiye özgü bazı fonksiyonları da kullanarak kolaylık getirmek amacıyla geliştirilmiştir.
ADQL, bazı astronomi verisini sorgularken çok kullanılan bazı fonksiyonları içermektedir. Bunlar;
Matematiksel Fonksiyon ve Operatörler¶
ABS, ACOS, ASIN, ATAN, ATAN2, CEILING, COS, DEGREES, EXP, FLOOR, LOG, LOG10, MOD, PI, POWER, RADIANS, RAND, ROUND, SIN, SQRT, TAN, TOP, TRUNCATE
Geometrik Fonksiyon ve Operatörler¶
AREA, BOX, CENTROID, CIRCLE, CONTAINS, COORD1, COORD2, COORDSYS, DISTANCE, INTERSECTS, POINT, POLYGON, REGION
Bir ADQL sorgusunun temel yapısı;
SELECT
[ ALL | DISTINCT ]
[ TOP unsigned_decimal ]
{
* |
{ value_expression [ [AS] column_name ] }, ...
}
FROM {
{
table_name [ [AS] identifier ] |
( SELECT ....) [ [AS] identifier ] |
table_name [NATURAL]
[ INNER | { LEFT | RIGHT | FULL [OUTER] } ]
JOIN table_name
[ON search_condition | USING ( column_name,...) ]
},
...
}
[ WHERE search_condition ]
[ GROUP BY group_by_term, ... ]
[ HAVING search_condition ]
[ ORDER BY
{ order_by_expression } [ ASC | DESC],
...
]
[ OFFSET unsigned_decimal ]
şeklindedir.
Alt sorgular (Subqueries)¶
Tablo alt sorguları, bir sorgunun WHERE ile verilen bir koşul için IN ve EXISTS gibi yapılar ile birleştirilmesiyle kurgulanabilir.
SELECT
alpha_source.id
FROM
alpha_source
WHERE
alpha_sourceid >=5
AND
alpha_sourceid IN
(
SELECT id FROM alpha_source WHERE id < 10
)
Sorgu Birleştirme İşlemleri¶
ADQL, INNER ve OUTER (LEFT, RIGHT ve FULL) birleştirmelerini destekler. Herhangi bir tür belirtilmezse varsayılan değer INNER olur.
Koşullu Sorgular¶
SQL dilinin yapıları olan JOIN, HAVING ve WHERE ifadeleri kullanılarak sorgular koşullara bağlanabilir. Bu amaçla karşılaştırma operatörleri ("=, !=, <>, <, >, <=, >=") gibi yapılardan, NOT,BETWEEN, LIKE, ILIKE gibi ifadelerden, IS NULL, IS NOT NULL ve EXISTS gibi kontrol yapılarından faydalanılabilir.
ADQL Örnekleri¶
ADQL kullanımıı örneklendirmek üzere aşağıda Simbad ve Gaia veritabanlarını sorgulamak üzere seçilmiş bazı örnekler yer almaktadır. Bu örnekler için ilgili veritabanlarına astroquery modülü fonksiyonları aracılığıyla bağlanılacaktır.
Simbad Veritabanı ADQL Örnekleri¶
Simbad veritabanında ADQL sorguları Table Access Protocol (TAP) servisi aracılığyla gerçekleştirilir. astroquery.simbad modülü bu servise string formatında kurgulanan sorguları query_tap fonksiyonu ile gönderir. Dönen sonuç bir astropy tablosudur.
import astroquery
from astroquery.gaia import Gaia
from astroquery.simbad import Simbad
Simbad.ROW_LIMIT = -1
Örnek-1: İsimlerinden biri sağlanan bir nesnenin temel parametrelerinin çekilmesi¶
Aşağıdaki sorguda M13'ün OID, RA, DEC, main_id gibi bazı temel parametrelerinin yanısıra galdim_majaxix, galdim_minaxis, galdim_angle gibi galaksinin şeklini tanımalayan parametreleri Simbad veritabanının "Basic Search" ile erişilen $basic$ ile "By Identifier Search" ile erişilen $ident$ tabloları sırasıyla OID ve OIDREF sütunları üzerinden bağlanarak sorgulanmasıyla elde edilmektedir.
# Basic data from an object given one of its identifiers.
adql_simbad_sorgu1 = """SELECT basic.OID,
RA,
DEC,
main_id AS "Main identifier",
coo_bibcode AS "Coord Reference",
nbref AS "Number of References",
plx_value as "Parallax",
rvz_radvel as "Radial velocity",
galdim_majaxis,
galdim_minaxis,
galdim_angle AS "Galaxy ellipse angle"
FROM basic JOIN ident ON oidref = oid
WHERE id = 'm13';"""
r = Simbad.query_tap(adql_simbad_sorgu1)
print(r['Main identifier','galdim_majaxis','galdim_minaxis','Galaxy ellipse angle'])
Main identifier galdim_majaxis galdim_minaxis Galaxy ellipse angle
arcmin arcmin deg
--------------- -------------- -------------- --------------------
M 13 33.0 33.0 0
Örnek-2: Bibliyografik referansı (künyesi) verilen bir yayında yer alan nesnelerin çekilmesi¶
Aşağıdaki sorguda $2006AJ.131.1163S$ referansında yer alan nesneler "Reference Query" yoluyla erişilen $has\_ref$ ve "Basic Query" yoluyla erişilen $basic$ tablolarının sırasıyla oidref ve oid sütunları üzerinden bağlanmasıyla elde edilen ve basic.OID ve main_id sütunlarından oluşan tablo, main_id (sorgudaki lakabı Identifier olarak belirlenmektedir) sütununa göre sıralanmaktadır.
# Display objects contained in a given bibliographic reference.
adql_simbad_sorgu2 = """SELECT basic.OID, main_id AS "Identifier"
FROM has_ref JOIN basic ON oidref = oid JOIN ref ON oidbibref = oidbib
WHERE bibcode = '2006AJ.131.1163S'
ORDER BY "Identifier";"""
r = Simbad.query_tap(adql_simbad_sorgu2)
r
| oid | Identifier |
|---|---|
| int64 | object |
| 3194687 | 2MASX J04504846-7531580 |
| 675533 | Cl Melotte 22 |
| 1575544 | M 31 |
| 1569144 | M 32 |
| 2419335 | NAME Galactic Center |
| 3133169 | NAME LMC |
| 535744 | NAME Lockman Hole |
| 3253618 | NAME SMC |
Örnek-3: Bir nesnenin çeşitli fotometrik bantlardaki parlaklıklarının çekilmesi¶
Aşağıdaki ADQL sorgusunda Simbad veritabanının $allfluxes$ tablosundan B,V,R,I,J sütunları, bu tablonun "Identifier Query" ile erişilen $ident$ tablosunun oidref sütunları üzerinden bağlanmasıyla M13 cismi için elde edilmektedir.
# Basic magnitudes of an object (from one identifier)
adql_simbad_sorgu3 = """SELECT B, V, R ,I , J from allfluxes
JOIN ident USING(oidref)
WHERE id = 'm13';"""
r = Simbad.query_tap(adql_simbad_sorgu3)
r
| B | V | R | I | J |
|---|---|---|---|---|
| float64 | float64 | float64 | float64 | float64 |
| -- | 5.800000190734863 | -- | -- | 4.452000141143799 |
Gaia Veritabanı ADQL Örnekleri¶
Gaia veritabanında ADQL sorguları Gaia Veri Arşivi "Advanced ADQL" servisi aracılığyla gerçekleştirilir. astroquery.gaia modülü bu servise string formatında kurgulanan sorguları launch_job fonksiyonu ile gönderir. Sorgu nesnesinin get_results() metodu, istenen sorgu sonucunu, bir astropy tablosu olarak verir.
Örnek-1: Belirli bir dairesel alandan seçilen noktaların bir gökyüzü koordinatına açısal uzaklıkları¶
Aşağıdaki sorguda koordinatları $RA = 81^{\circ}.28$ ve $DEC = -69^{\circ}.78$ olan bir noktaya, bu sağaçıklık ve dikaçıklık merkezli, 5 yaydakikası yarıçapında bir çemberin içinde kalan gaiadr3.gaia_source Gaia DR3 cisimlerinden 20.5 kadirden daha parlak ve paralaks değeri ölçülmüş olanlarının tüm sütunları ve bu noktaya olan açısal uzaklıklıklarından oluşan bir tablo elde edilmektedir.
# Cone search sorted by angular separation
adql_gaia_sorgu1 = """SELECT *, DISTANCE(POINT(81.28, -69.78), POINT(ra, dec)) AS ang_sep
FROM gaiadr3.gaia_source WHERE 1 = CONTAINS(
POINT(81.28, -69.78),CIRCLE(ra, dec, 5./60.))
AND phot_g_mean_mag < 20.5
AND parallax IS NOT NULL
ORDER BY ang_sep ASC"""
job = Gaia.launch_job(adql_gaia_sorgu1)
r = job.get_results()
#r['DESIGNATION','ra','dec','ang_sep'].pprint_all()
Örnek-2: HIPPARCOS ve Gaia Veritabanlarının Çapraz Eşleştirmesi¶
Aşağıdaki sorguda public.hipparcos tablosunun gaiadr3.gaia_source tablosuyla $0^{\circ}.00028$'lik bir tolerans değeri ile çapraz eşleştirilmesi sonrası biribiriyle eşleşen ilk 1000 satırın tüm sütunları ve her iki katalogdaki konumları arası açısal uzaklık ($ang\_sep$) değerlerinden oluşan bir tablo elde edilmektedir.
# Basic positional cross-match between HIPPARCOS & Gaia
adql_gaia_sorgu2 = """SELECT TOP 1000 *, DISTANCE(POINT(hip.ra, hip.de),
POINT(gaia.ra, gaia.dec)) AS ang_sep
FROM public.hipparcos AS hip
JOIN gaiadr3.gaia_source AS gaia
ON 1 = CONTAINS(
POINT(hip.ra, hip.de),
CIRCLE(gaia.ra, gaia.dec, 0.00028))"""
job = Gaia.launch_job(adql_gaia_sorgu2)
r = job.get_results()
#r['DESIGNATION','hip','ang_sep'].pprint_all()
Örnek-3: Gaia DR2 ve EDR3'nin Çapraz Eşleştirmesi¶
Aşağıdaki sorguda Gaia Data-Release 2 (DR2) ($gaiadr2.gaia\_source$) ve Early Data Release-3 (EDR3) ($gaiadr3.dr2\_neighbourhood$) tablolarının sırasıyla dr2.source_id ve dr3.dr2_source_id sütunları üzerinden bağlanması sonucu $G$ bandında ortalama olarak 5 kadirden parlak cisimlerin her iki katalogdaki ID numaraları ve parlaklıklarının artan sırada sıralandığı bir tablo oluşmaktadır.
# Bright sources in DR2 and EDR3
adql_gaia_sorgu3 = """SELECT dr2.source_id, dr2.phot_g_mean_mag, dr3.*
FROM gaiadr2.gaia_source AS dr2
JOIN gaiadr3.dr2_neighbourhood AS dr3 ON dr2.source_id = dr3.dr2_source_id
WHERE dr2.phot_g_mean_mag < 5
ORDER BY dr2.source_id ASC"""
job = Gaia.launch_job(adql_gaia_sorgu3)
r = job.get_results()
r['source_id','dr2_source_id','phot_g_mean_mag']
| source_id | dr2_source_id | phot_g_mean_mag |
|---|---|---|
| mag | ||
| int64 | int64 | float32 |
| 5228079006411904 | 5228079006411904 | 4.9305253 |
| 8900825800310016 | 8900825800310016 | 4.631795 |
| 11166438229104768 | 11166438229104768 | 3.2567198 |
| 12730974555930624 | 12730974555930624 | 3.5547247 |
| 18118925129052544 | 18118925129052544 | 4.5806127 |
| 20959135462406400 | 20959135462406400 | 4.811952 |
| ... | ... | ... |
| 6194563955869798784 | 6194563955869798784 | 2.6158924 |
| 6198599507144514432 | 6198599507144514432 | 4.9555035 |
| 6201910274092649856 | 6201910274092649856 | 4.0214148 |
| 6203033940614597504 | 6203033940614597504 | 3.4967654 |
| 6203042324394718976 | 6203042324394718976 | 4.8666162 |
| 6209215257546774016 | 6209215257546774016 | 3.5448275 |