گراف دانش به عنوان هستیشناسی در علوم اطلاعاتی و محاسباتی شناخته میشود که یک ساختار برای ذخیره، بازیابی و به اشتراکگذاری مفاهیم موجود در یک دامنه و ضوابط و روابط بین آنها است. علوم اطلاعات و علوم محاسبات برای گسترش و کارایی بیشتر و نیز برآورده نمودن نیازهایی مانند وب معنایی، نیازمند به ساخت و ایجاد گراف دانش هستند.
در ساخت گراف دانش، دو وظیفه بایستی به درستی انجام شوند، وظیفه ذخیره اطلاعات و وظیفه استخراج اطلاعات. پیشرفتهای نوین هوشمصنوعی به خصوص در زمینه یادگیری ماشین و به دنبال آن در یادگیری عمیق، به انجام هر چه بهتر این دو وظیفه کمک میکند.
ساخت گراف دانش در حوزههای مختلف و استفاده از یادگیری عمیق برای استخراج اطلاعات میتواند دریچه نوینی به روی انبوهی از اطلاعات پردازش نشده متنی در آن حوزه باشد. همچون متنهای فقهی، متنهای حقوقی، متنهای ورزشی، سینمایی و امثال اینها.
به طور مثال فرض کنید در حوزه ورزشی، قسمت لیگ برتر فوتبال ایران، در تمامی وبسایتهای خبری، وبسایتهای ورزشی، روزنامههای عمومی و ورزشی، همواره در ارتباط با این قسمت، نوشتهها و متنهای بسیاری تولید شده و میشوند و در بهترین حالت امکان جستجوی متنی بر روی آنها امکان پذیر است.
با کمک گراف دانش و یادگیری عمیق، میتوان اطلاعات موجود را پردازش کرد، موجودیتها و روابط را شناسایی کرد و از این اطلاعات گراف دانش را در این حوزه ساخت.
به عنوان مثال در شکل زیر موجودیتها و ارتباطات بین آنها برای مسابقههای فوتبال نشان داده شده است.
در این شکل ۵ کلاس مسابقه، لیگ، تیم، داور و استادیوم توصیف شده است. نمونههای این کلاسها با هم در ارتباط هستند به طور مثال یک تیم در یک یا چند مسابقه که در یک لیگ است بازی میکند. ارتباط بین این کلاسها با خصیصهها توصیف میشود. به عنوان مثال: خصیصهی MEMBERSHIP، نمونههایی از کلاس تیم را به نمونههایی از کلاس لیگ مرتبط میکند که بیانگر عضویت یک تیم فوتبال در یک لیگ فوتبال است.
اطلاعات متنی تولید شده در مورد لیگ فوتبال باید به کلاسها، نمونهها و خصیصههای گراف دانش لیگ برتر نگاشت شوند. شکل زیر یکی از مسابقههای فوتبال لیگ برتر را نشان میدهد.
برای ذخیرهسازی هر گراف دانشی به یک پایگاهداده گرافی نیاز داریم. در ادامه به توضیح پایگاه داده گرافی میپردازیم و چند پایگاهداده گرافی را معرفی میکنیم.
پایگاهدادهی گرافی چیست ؟
یک پایگاه داده گرافی ابزاری آنلاین برای مدیریت سیستم اطلاعاتی است که عملیات CRUD را بر روی مدل داده گرافی انجام میدهد. برخلاف سایر پایگاههای داده، روابط (relationship) از اولویت بالایی برخوردارند و برای دسترسی به داده نیازی به تعریف foreign keys یا پردازش های خارج از باند نظیر MapReduce نیست.
پایگاهدادههای گرافی از گرهها برای ذخیره اطلاعات موجودیتها و لبهها برای ذخیره روابط بین موجودیتها استفاده میکنند. یک لبه همیشه دارای یک گره شروع، گره انتهایی، نوع و جهت است و یک لبه میتواند روابط والدین و فرزند، اقدامات، مالکیت و موارد مشابه را توصیف کند. از نظر تعداد و نوع روابط برای یک گره محدودیتی وجود ندارد.
انواع پایگاه دادههای گرافی
برخی از معروفترین پایگاهدادههای گرافی که غالبا متنباز هستند عبارتند از
- 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 را هم فراهم کرده است.
فوتمن
در این دستیار هوشمند ابتدا گفتار حاوی سوال به متن تبدیل میشود، سپس متن حاوی سوال توسط چندین الگوریتم یادگیری عمیق به یک پرسوجو (query) نگاشت میشود و سپس بر اساس نتیجه پرسوجو، جواب آماده میشود.
گراف دانش فوتمن شامل چندین موجودیت است که برخی در ادامه آورده شده است.
- CLUB ← موجودیت یک تیم فوتبال است
- PLAYER ← موجودیت یک بازیکن است
- STADIUM ← موجودیت یک استادیوم فوتبال است
این موجودیتها با یک یا چندین رابطه به یکدیگر وصل هستند. برخی از این رابطهها عبارتند از:
- BELONG ← ارتباط بین یک بازی و یک لیگ را مشخص میکند
- CONTRACT ← قرارداد بین یک بازکن و یک تیم را مشخص میکند
- PLAYED ← ارتباط بین یک بازیکن و بازی که در آن بازی کرده است را مشخص میکند
به عنوان مثال اگر سوالهای زیر را از فوتمن بپرسید بدین شکل پاسخ را آماده میکند.
سوال: کدام بازیکن پرسپولیس در لیگ هجدهم به عنوان آقای پاس گلی دست یافت؟
- استخراج موجودیتهای متن
- Club → پرسپولیس
- League → لیگ هجدهم
- انتخاب پرسوجو
MATCH (p: PLAYER)-[s: SCORER]->(m: MATCH)–>(l:LEAGUE{{season: “{season}”}})
MATCH (c:CLUB)–>(m)
WHERE s.assists<>”000″ AND c.club_id =”{club}”
WITH p, COUNT(s.assists) as a
ORDER BY a {DESC}
RETURN p, a , {assists} LIMIT {limit}
- انجام پرسوجو و ساخت پاسخ
سوال: بازی شهر خودرو و پارس جنوبی چند چند شد؟
- استخراج موجودیتهای متن
- Club → شهر خودرو
- Club → پارس جنوبی
- انتخاب پرسوجو
MATCH (c1:CLUB)-[side1:STATS]->(sm:MATCH)-[b:BELONG]->(l:LEAGUE {{season: “{season}”}})
MATCH (c2:CLUB)-[side2:STATS]->(sm)
WHERE c1.club_id =”{c1_id}” and c2.club_id = “{c2_id}” and sm.status = “FT”
RETURN c1,c2,sm, side1, side2
ORDER BY sm.date DESC LIMIT 1
- انجام پرسوجو و ساخت پاسخ
نصب و راهاندازی Neo4j
- 1. ابتدا از سایت 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 میتوانید از طریق آدرس زیر به داشبورد پایگاه داده متصل شوید و پرسوجوهای خود را در آن انجام دهید.
پروتکل Bolt
پروتکل شبکه bolt یک پروتکل بسیار کارآمد و سبک وزن client-server است که برای برنامههای پایگاه داده طراحی شده است و امکان ارسال عباراتی (statement) که شامل یک رشته و مجموعه پارامترهای تایپ شده است را فراهم میکند. سرور به هر درخواست به صورت اختیاری نتایج پیشین یا پیام نتیجه را باز میگرداند.
نصب درایوهای Neo4j
اتصال پایگاهداده Neo4j به زبان برنامهنویسی پایتون از طریق درایوها (drivers) با bolt یا http انجام میشود.
نصب پکیج:
pip install neo4j
مثال:
from neo4j import GraphDatabase
driver = GraphDatabase.driver(“bolt://localhost:7687”, auth=(“neo4j”, “password”))
def add_friend(tx, name, friend_name):
tx.run(“MERGE (a:Person {name: $name}) “
“MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})”,
name=name, friend_name=friend_name)
def print_friends(tx, name):
for record in tx.run(“MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name “
“RETURN friend.name ORDER BY friend.name”, name=name):
print(record[“friend.name”])
with driver.session() as session:
session.write_transaction(add_friend, “Arthur”, “Guinevere”)
session.write_transaction(add_friend, “Arthur”, “Lancelot”)
session.write_transaction(add_friend, “Arthur”, “Merlin”)
session.read_transaction(print_friends, “Arthur”)
session.read_transaction(print_friends, “Arthur”)
اگر این مطلب برای شما مفید بود آن را با دوستان خود به اشتراک بگذارید.