گراف دانش و هوش‌مصنوعی

گراف دانش به عنوان هستی‌شناسی در علوم اطلاعاتی و محاسباتی شناخته ‌می‌شود که یک ساختار برای ذخیره، بازیابی و به اشتراک‌گذاری مفاهیم موجود در یک دامنه و ضوابط و روابط بین آن‌ها است. علوم اطلاعات و علوم محاسبات برای گسترش و کارایی بیشتر و نیز برآورده نمودن نیازهایی مانند وب معنایی، نیازمند به ساخت و ایجاد گراف دانش هستند.

در ساخت گراف دانش، دو وظیفه بایستی به درستی انجام شوند، وظیفه ذخیره اطلاعات و وظیفه استخراج اطلاعات. پیشرفت‌های نوین هوش‌مصنوعی به خصوص در زمینه یادگیری ماشین و به دنبال آن در یادگیری عمیق، به انجام هر چه بهتر این دو وظیفه کمک می‌کند.

ساخت گراف دانش در حوزه‌های مختلف و استفاده از یادگیری عمیق برای استخراج اطلاعات می‌تواند دریچه نوینی به روی انبوهی از اطلاعات پردازش نشده متنی در آن حوزه باشد. همچون متن‌های فقهی، متن‌های حقوقی، متن‌های ورزشی، سینمایی و امثال این‌ها.

به طور مثال فرض کنید در حوزه ورزشی، قسمت لیگ برتر فوتبال ایران، در تمامی وب‌سایت‌های خبری، وب‌سایت‌های ورزشی، روزنامه‌های عمومی و ورزشی، همواره در ارتباط با این قسمت، نوشته‌ها و متن‌های بسیاری تولید شده و می‌شوند و در بهترین حالت امکان جستجوی متنی بر روی آن‌ها امکان پذیر است.

با کمک گراف دانش و یادگیری عمیق، می‌توان اطلاعات موجود را پردازش کرد، موجودیت‌ها و روابط را شناسایی کرد و از این اطلاعات گراف دانش را در این حوزه ساخت.

به عنوان مثال در شکل زیر موجودیت‌ها و ارتباطات بین آن‌ها برای مسابقه‌های فوتبال نشان داده شده است.

در این شکل ۵ کلاس مسابقه، لیگ، تیم، داور و استادیوم توصیف شده است. نمونه‌های این کلاس‌ها با هم در ارتباط هستند به طور مثال یک تیم در یک یا چند مسابقه که در یک لیگ است بازی ‌می‌کند. ارتباط بین این کلاس‌ها با خصیصه‌ها توصیف ‌می‌شود. به عنوان مثال: خصیصه‌ی MEMBERSHIP، نمونه‌هایی از کلاس تیم را به نمونه‌هایی از کلاس لیگ مرتبط می‌کند که بیان‌گر عضویت یک تیم فوتبال در یک لیگ فوتبال است.

اطلاعات متنی تولید شده در مورد لیگ فوتبال باید به کلاس‌ها، نمونه‌ها و خصیصه‌های گراف دانش لیگ برتر نگاشت شوند. شکل زیر یکی از مسابقه‌های فوتبال لیگ برتر را نشان می‌دهد.

برای ذخیره‌سازی هر گراف دانشی به یک پایگاه‌داده گرافی نیاز داریم. در ادامه به توضیح پایگاه داده گرافی می‌پردازیم و چند پایگاه‌داده گرافی را معرفی می‌کنیم.

پایگاه‌داده‌ی گرافی چیست ؟

یک پایگاه‌ داده‌ گرافی ابزاری آنلاین برای مدیریت سیستم اطلاعاتی است که عملیات CRUD را بر روی مدل داده گرافی انجام می‌دهد. برخلاف سایر پایگاه‌های داده‌، روابط (relationship) از اولویت بالایی برخوردارند و برای دسترسی به داده نیازی به تعریف foreign keys یا پردازش های خارج از باند نظیر Map Reduce نیست.

پایگاه‌داده‌های گرافی از گره‌ها برای ذخیره اطلاعات موجودیت‌ها و لبه‌ها برای ذخیره روابط بین موجودیت‌ها استفاده می‌کنند. یک لبه همیشه دارای یک گره شروع، گره انتهایی، نوع و جهت است و یک لبه می‌تواند روابط والدین و فرزند، اقدامات، مالکیت و موارد مشابه را توصیف کند. از نظر تعداد و نوع روابط برای یک گره محدودیتی وجود ندارد.

انواع پایگاه‌ داده‌‌های گرافی

برخی از معروف‌ترین پایگاه‌داده‌های گرافی که غالبا متن‌باز هستند عبارتند از

  • Grakn
  • FlockDB
  • AllegroGraph
  • GraphDB
  • InfiniteGraph
  • Neo4j

این پایگاه‌داده‌ها هر یک معایب و مزایای خودشان را دارند که بررسی آن‌ها در این مطلب نمی‌گنجد. در ادامه هر یک را به صورت مختصر معرفی می‌کنیم.

InfiniteGraph


یک پایگاه داده گرافی مبتنی بر جاوا است که توسط کمپانی به همین نام طراحی شده است. هدف این شرکت ساخت یک پایگاه داده با مقیاس پذیری نامحدود می باشد.

GraphDB


پایگاه داده GraphDB یک پایگاه داده‌ی گرافی بر اساس .NET می باشد که توسط کمپانی sones طراحی شده است.

FlockDB

این گراف دیتابیس توسط توئیتر و برای تحلیل ارتباطات طراحی و ساخته شده است.

AllegroGraph

پایگاه‌داده گرافی AllegroGraph توسط W3C ساخته شده و برای منابع با چارچوب توصیفی می‌باشد. این پایگاه‌داده گرافی طراحی شده است تا با Linked Data ها و Semantic Web کار کند.

Grakn

پایگاه‌داده گرافی GRAKN.AI یک گراف دانش منبع باز و توزیع شده برای سیستم های دانش محور است که کاملا مدل (ER(Entity-Relationship را پیاده‌سازی می‌کند. این پایگاه‌داده زبان جستجوی خود را دارد به اسم Graql.

Neo4j

پایگاه داده‌ گرافی Neo4j یک گراف دانش معروف و متن باز مبتنی بر جاوا است. Neo4j برای جستجو در پایگاه‌داده علاوه بر زبان مخصوص به خودش یعنی Cypher امکان استفاده از Graphql را هم فراهم کرده است.

فوتمن

اپلیکیشن موبایل فوتمن یک دستیار هوشمند فوتبالی است که بر پایه‌ی گراف دانش و یادگیری عمیق توسعه داده شده است. برای توسعه این دستیار هوشمند از پایگاه‌داده Neo4j استفاده شده است و به کمک یادگیری عمیق، فوتمن می‌تواند به پرسش‌های فوتبالی مرتبط با لیگ برتر ایران به شما پاسخ دهد.

در این دستیار هوشمند ابتدا گفتار حاوی سوال به متن تبدیل می‌شود، سپس متن حاوی سوال توسط چندین الگوریتم یادگیری عمیق به یک پرس‌وجو (query) نگاشت می‌شود و سپس بر اساس نتیجه پرس‌و‌جو، جواب آماده می‌شود.

گراف دانش فوتمن شامل چندین موجودیت است که برخی در ادامه آورده شده است.

  • موجودیت CLUB ← موجودیت یک تیم فوتبال است
  • موجودیت PLAYER ← موجودیت یک بازیکن است
  • موجودیت STADIUM ← موجودیت یک استادیوم فوتبال است

این موجودیت‌ها با یک یا چندین رابطه به یکدیگر وصل هستند. برخی از این رابطه‌ها عبارتند از:

  • ارتباط BELONG ← ارتباط بین یک بازی و یک لیگ را مشخص می‌کند
  • ارتباط CONTRACT ← قرارداد بین یک بازکن و یک تیم را مشخص می‌کند
  • ارتباط PLAYED ← ارتباط بین یک بازیکن و بازی که در آن بازی کرده است را مشخص می‌کند


به عنوان مثال اگر سوال‌های زیر را از فوتمن بپرسید بدین شکل پاسخ را آماده می‌کند.

سوال: کدام بازیکن پرسپولیس در لیگ هجدهم به عنوان آقای پاس گلی دست یافت؟
۱. استخراج موجودیت‌های متن

  • موجودیت Club → پرسپولیس
  • موجودیت League → لیگ هجدهم

۲. انتخاب پرس‌و‌جو

MATCH (p: PLAYER)-[s: SCORER]->(m: MATCH)-->(l:LEAGUE{{season: &quot{season}&quot}})
MATCH (c:CLUB)-->(m)
WHERE s.assists<>&quot000&quot AND c.club_id =&quot{club}&quot
WITH p, COUNT(s.assists) as a
ORDER BY a {DESC}
RETURN p, a , {assists} LIMIT {limit}

۳. انجام پرس‌و‌جو و ساخت پاسخ

سوال: بازی شهر خودرو و پارس جنوبی چند چند شد؟

  1. استخراج موجودیت‌های متن
  • موجودیت Club → شهر خودرو
  • موجودیت Club → پارس جنوبی

۲. انتخاب پرس‌و‌جو

MATCH (c1:CLUB)-[side1:STATS]->(sm:MATCH)-[b:BELONG]->(l:LEAGUE {{season: &quot{season}&quot}})
MATCH (c2:CLUB)-[side2:STATS]->(sm)
WHERE c1.club_id =&quot{c1_id}&quot and c2.club_id = &quot{c2_id}&quot and sm.status = &quotFT&quot
RETURN c1,c2,sm, side1, side2
ORDER BY sm.date DESC LIMIT 1

۳. انجام پرس‌و‌جو و ساخت پاسخ

اگر علاقه‌مند شدید که در برنامه‌ها و اپلیکیشن‌های خود از گراف دانش استفاده کنید، می‌توانید نحوه نصب و راه‌اندازی و همچنین استخراج اطلاعات از گراف دانش، از طریق زبان برنامه نویسی پایتون را در ادامه ملاحظه نمایید.

نصب و راه‌اندازی Neo4j

۱. ابتدا از سایت Neo4j نسخه‌ Neo4j Community را دریافت و آن را از حالت فشرده خارج کنید :

tar -xf  neo4j-community-3.5.12.tar

۲. برای اجرای سرویس به مانند زیر عمل کنید

cd neo4j-community-3.5.12
bin/neo4j start

۳. برای توقف سرویس نیز می‌توانید به صورت زیر عمل کنید

bin/neo4j stop

چنانچه بخواهید می‌توانید از طریق داکر هم این سرویس را راه‌اندازی کنید.

sudo docker run --publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data neo4j

پس از راه‌اندازی سرویس Neo4J می‌توانید از طریق آدرس زیر به داشبورد پایگاه داده متصل شوید و پرس‌و‌جوهای خود را در آن انجام دهید.

http://localhost:7474


Neo4j Panel
Neo4j Panel


پروتکل Bolt

پروتکل شبکه bolt یک پروتکل بسیار کارآمد و سبک وزن client-server است که برای برنامه‌های پایگاه داده طراحی شده است و امکان ارسال عباراتی (statement) که شامل یک رشته و مجموعه پارامترهای تایپ شده است را فراهم می‌کند. سرور به هر درخواست به صورت اختیاری نتایج پیشین یا پیام نتیجه را باز می‌گرداند.

نصب درایو‌های Neo4j

اتصال پایگاه‌داده Neo4j به زبان برنامه‌نویسی پایتون از طریق درایو‌ها (drivers) با bolt یا http انجام می‌شود.

نصب پکیج:

pip install neo4j

مثال:

from neo4j import GraphDatabase

driver = GraphDatabase.driver(&quotbolt://localhost:7687&quot, auth=(&quotneo4j&quot, &quotpassword&quot))

def add_friend(tx, name, friend_name):
              tx.run(&quotMERGE (a:Person {name: $name}) &quot
              &quotMERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})&quot,
              name=name, friend_name=friend_name)
 
def print_friends(tx, name):
          for record in tx.run(&quotMATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name &quot
          &quotRETURN friend.name ORDER BY friend.name&quot, name=name):
                    print(record[&quotfriend.name&quot])

with driver.session() as session:
          session.write_transaction(add_friend, &quotArthur&quot, &quotGuinevere&quot)
          session.write_transaction(add_friend, &quotArthur&quot, &quotLancelot&quot)
          session.write_transaction(add_friend, &quotArthur&quot, &quotMerlin&quot)
          session.read_transaction(print_friends, &quotArthur&quot)