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 |