ساخت عرشه MTG با Apache AGE!

معرفی
بعد از آموزش قبلی ام در مورد نشان دادن اینکه Apache AGE چگونه می تواند یک پایگاه داده نموداری برای Magic: The Gathering ایجاد کند، تصمیم گرفتم آموزش ایجاد Deck با آن را ایجاد کنم! ما روند فکری را در مورد انتخاب موجودات، افسون ها، جادوها و نحوه یافتن این کارت ها برای ایجاد استراتژی برای عرشه پوشش خواهیم داد.
ما یک عرشه با عنوان “بوگلز“، که این موجود را مشخص می کند لغزنده بوگل و موجودات دیگری که توانایی مشابه آن را دارند. لغزنده بوگل از دیگر جادوهایی که حریف به آن می اندازد مصون است، بنابراین تمرکز عرشه ما این است که این نوع موجودات و همچنین جادوهایی را پیدا کنیم تا آنها را به هم بزنیم. به طور کلی، هر عرشه شامل 60 کارت است و نمی تواند بیش از 4 نسخه از هر کدام داشته باشد، به جز زمین های اصلی.
علاوه بر این، برخی از تصاویر نمودار از Apache AGE Viewer گرفته شده است که به ما امکان می دهد نمودار را به روشی بهتر تجسم کنیم.
باگ ها را گوگل کنید
اول از همه، اجازه دهید یک راس برای نشان دادن Deck که در حال ساخت آن هستیم ایجاد کنیم. عنوان “Bogles” خواهد بود و شامل موجوداتی با Hexproof توانایی این توانایی مانع از قرار گرفتن دائمی در هدف جادوها یا توانایی هایی می شود که توسط حریفان انجام می شود.
SELECT * FROM cypher('MTG', $$
CREATE(d:Deck {name: 'Bogles', format: 'Pauper', colors:'{G}{W}'})
RETURN d
$$) as (deck agtype);
حال بیایید به دنبال موجوداتی بگردیم که دارای آن هستند Hexproof توانایی آنها باید موجودات سبز یا سفید باشند، زیرا ما عرشه خود را طوری تنظیم کردهایم که فقط آن رنگها را داشته باشد و برای ریختن آنها باید ارزان باشد، بنابراین ممکن است 3 مانا یا کمتر هزینه داشته باشد.
SELECT * FROM cypher('MTG', $$
MATCH (c:Creature)
WHERE c.oracle_text CONTAINS 'Hexproof' AND (c.mana_cost CONTAINS 'G' OR c.mana_cost CONTAINS 'W') AND
(toInteger(substring(c.mana_cost, 1, 1)) <= 2 OR toInteger(substring(c.mana_cost, 1, 1)) IS NULL)
RETURN c.name, c.mana_cost
$$) as (card_name agtype, mana_cost agtype);
پرس و جو ابتدا موجوداتی با هزینه مانا را جستجو می کند که حاوی کاراکتر G یا W هستند تا نیاز موجوداتی را که حداقل به یک مانا سبز یا یک مانا سفید نیاز دارند برآورده کند. سپس کاراکتر را بین اولین مجموعه از پرانتزهای مجعد {} می گیرد و رشته را به یک عدد صحیح تبدیل می کند. اگر عدد صحیح حاصل کوچکتر یا مساوی 2 باشد، مطابقت داده می شود. از آنجایی که این احتمال وجود دارد که کاراکتر داخل یک عدد نباشد، بلکه یک حرف باشد، جستجو نتایجی را که تولید می کنند نیز تهی می کند.
کارت هایی که پیدا کردیم عبارتند از:
card_name | mana_cost
-----------------------+-----------
"Slippery Bogle" | "{U/G}"
"Gladecover Scout" | "{G}"
"Silhana Ledgewalker" | "{1}{G}"
(3 rows)
ما چهار نسخه از هر یک از این کارت ها را به عرشه خود اضافه می کنیم
demo=# SELECT * FROM cypher('MTG', $$
MATCH (d:Deck), (c1:Creature), (c2:Creature), (c3:Creature)
WHERE d.name = "Bogles" AND c1.name = "Slippery Bogle" AND c2.name = "Gladecover Scout" AND c3.name ="Silhana Ledgewalker"
CREATE (c1)<-[:CONTAINS {quantity: 4}]-(d)-[:CONTAINS {quantity:4}]->(c2), (c3)<-[:CONTAINS {quantity: 4}]-(d)
$$) as (a agtype);
تدریس خصوصی برای افسون ها
حالا بیایید به دنبال جادوهایی برای پمپاژ موجودات خود بگردیم. ما جادوهای ارزان قیمت می خواهیم که 3 مانا یا کمتر هزینه دارند و باید سفید یا سبز باشند.
SELECT * FROM cypher('MTG', $$
MATCH (c:Enchantment)
WHERE (c.mana_cost CONTAINS 'G' OR c.mana_cost CONTAINS 'W') AND
(toInteger(substring(c.mana_cost, 1, 1)) <= 2 OR toInteger(substring(c.mana_cost, 1, 1)) IS NULL)
RETURN c.name, c.mana_cost, c.oracle_text
$$) as (card_name agtype, mana_cost agtype, oracle_text agtype);
card_name | mana_cost | oracle_text
---------------------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
"Arrest" | "{2}{W}" | "Enchant creature. Enchanted creature can’t attack or block, and its activated abilities can’t be activated."
"Abundant Growth" | "{G}" | "Enchant land When Abundant Growth enters the battlefield, draw a card. Enchanted land has “{T}: Add one mana of any color.”"
"Cartouche of Solidarity" | "{W}" | "Enchant creature you control When Cartouche of Solidarity enters the battlefield, create a 1/1 white Warrior creature token with vigilance. Enchanted creature gets +1/+1 and has first strike."
"Ethereal Armor" | "{W}" | "Enchant creature Enchanted creature gets +1/+1 for each enchantment you control and has first strike."
"Rancor" | "{G}" | "Enchant creature Enchanted creature gets +2/+0 and has trample. When Rancor is put into a graveyard from the battlefield, return Rancor to its owner’s hand."
"Spirit Link" | "{W}" | "Enchant creature Whenever enchanted creature deals damage, you gain that much life."
"Utopia Sprawl" | "{G}" | "Enchant Forest Whenever As Utopia Sprawl enters the battlefield, choose a color. Whenever enchanted Forest is tapped for mana, its controller adds an additional one mana of the chosen color."
"Ancestral Mask" | "{2}{G}" | "Enchant creature Enchanted creature gets +2/+2 for each other enchantment on the battlefield."
"Armadillo Cloak" | "{1}{G}{W}" | "Enchant creature Enchanted creature gets +2/+2 and has trample. Whenever enchanted creature deals damage, you gain that much life."
(9 rows)
به جز «دستگیری»، همه افسونهای دیگر به ما کمک میکنند تا گلولههایمان را تقویت کنیم یا به ما کمک میکنند ماناهایی با رنگهای مختلف بفرستیم، که به ما کمک میکند اگر از یک مانای خاص خارج باشیم، طلسمهای خاصی را انجام دهیم. بیایید از هر کدام سه تا اضافه کنیم.
SELECT * FROM cypher('MTG', $$
MATCH (c:Enchantment), (d:Deck)
WHERE (c.mana_cost CONTAINS 'G' OR c.mana_cost CONTAINS 'W') AND
(toInteger(substring(c.mana_cost, 1, 1)) <= 2 OR toInteger(substring(c.mana_cost, 1, 1)) IS NULL)
AND c.name <> "Arrest" AND d.name = "Bogles"
CREATE (d)-[:CONTAINS {quantity: 3}]->(c)
$$) as (a agtype);
ما یک کارت دیگر اضافه خواهیم کرد که “Commune with Spirits” است، چهار مورد از آنها، فقط برای کمک به ما در یافتن جادوها یا سرزمینها.
SELECT * FROM cypher('MTG', $$
MATCH (c:Sorcery), (d:Deck)
WHERE c.name = "Commune with Spirits" AND d.name = "Bogles"
CREATE (d)-[:CONTAINS {quantity: 4}]->(c)
$$) as (a agtype);
در نهایت، زمین ها را اضافه می کنیم: 12 جنگل و 8 دشت.
SELECT * FROM cypher('MTG', $$
MATCH (f:Land), (p:Land), (d:Deck)
WHERE f.name = "Forest" AND p.name = "Plains" AND d.name = "Bogles"
CREATE (p)<-[:CONTAINS {quantity: 8}]-(d)-[:CONTAINS {quantity: 12}]->(f)
$$) as (a agtype);
افق های بی پایان
اکنون ما با موفقیت عرشه خود را ایجاد کرده ایم! کارهای دیگری که میتوانیم انجام دهیم این است که آن را در مقابل سایر دکها آزمایش کنیم و نتایج را در پایگاه داده نمودار خود ذخیره کنیم، یا قیمت کارتها را ذخیره کنیم تا بتوانیم یک نسخه اقتصادی از آن بسازیم، یا حتی این نوع دک را برای قالبهای دیگر ایجاد کنیم، نه فقط فرمت فقیر.
امکاناتی را که Apache AGE میتواند به ما ارائه دهد، برنامهها و نرمافزارهای بیپایانی که میتوان با آنها استفاده کرد، تصور کنید. تمام این قدرت جادویی از یک پسوند منبع باز برای PostgreSQL.
استفاده از Apache AGE مانند داشتن یک هواپیمای پیادهروی برای پایگاه داده خود است. همانطور که یک هواپیماگرد در MTG یک موجود قدرتمند با توانایی دستکاری واقعیت است، این پسوند پایگاه داده گراف می تواند پایگاه داده رابطه ای شما را به یک پایگاه داده گراف بسیار انعطاف پذیر و مقیاس پذیر تبدیل کند و به شما امکان تجزیه و تحلیل و تجسم روابط پیچیده بین نقاط داده را می دهد.
با قدرت آن، می توانید به راحتی الگوهای پنهان را کشف کنید، بینش عمیق تری به دست آورید و بر اساس روابط بین داده ها تصمیمات بهتری بگیرید. و همانطور که یک هواپیماگرد می تواند در طول زمان توانایی های قوی تری به دست آورد، پسوند پایگاه داده گراف نیز می تواند تکامل یافته و بهبود یابد زیرا داده های شما نیاز به رشد و تغییر دارند. بنابراین اگر به دنبال باز کردن پتانسیل کامل پایگاه داده رابطهای خود هستید، از قدرت Apache AGE برای PostgreSQL استفاده کنید.
وب سایت Apache AGE: https://age.apache.org/
مخزن Apache AGE GitHub: https://github.com/apache/age/