{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import json\n", "import os\n", "import random\n", "import hashlib\n", "import warnings\n", "import urllib.request\n", "import time\n", "\n", "import warnings\n", "\n", "warnings.filterwarnings(action='ignore')\n", "random.seed(47)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### import gremlin_python packages" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from gremlin_python import statics\n", "from gremlin_python.structure.graph import Graph\n", "from gremlin_python.process.graph_traversal import __\n", "from gremlin_python.process.strategies import *\n", "from gremlin_python.process.traversal import T, P, Operator, Scope, Column, Order\n", "from gremlin_python.process.anonymous_traversal import traversal\n", "from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Neptune endpoint 설정" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "NEPTUNE_ENDPOINT = 'Your-Neptune-Cluster-Endpoint'\n", "NEPTUNE_PORT = 8182" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def graph_traversal(neptune_endpoint=None, neptune_port=NEPTUNE_PORT, show_endpoint=True, connection=None):\n", " def _remote_connection(neptune_endpoint=None, neptune_port=None, show_endpoint=True):\n", " neptune_gremlin_endpoint = '{protocol}://{neptune_endpoint}:{neptune_port}/{suffix}'.format(protocol='wss',\n", " neptune_endpoint=neptune_endpoint, neptune_port=neptune_port, suffix='gremlin')\n", "\n", " if show_endpoint:\n", " print('gremlin: {}'.format(neptune_gremlin_endpoint))\n", " retry_count = 0\n", " while True:\n", " try:\n", " return DriverRemoteConnection(neptune_gremlin_endpoint, 'g')\n", " except HTTPError as ex:\n", " exc_info = sys.exc_info()\n", " if retry_count < 3:\n", " retry_count += 1\n", " print('Connection timeout. Retrying...')\n", " else:\n", " raise exc_info[0].with_traceback(exc_info[1], exc_info[2])\n", "\n", " if connection is None:\n", " connection = _remote_connection(neptune_endpoint, neptune_port, show_endpoint)\n", " return traversal().withRemote(connection)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def clear_graph(neptune_endpoint=None, neptune_port=NEPTUNE_PORT, batch_size=200, edge_batch_size=None, vertex_batch_size=None):\n", " if edge_batch_size is None:\n", " edge_batch_size = batch_size\n", " if vertex_batch_size is None:\n", " vertex_batch_size = batch_size\n", " g = graph_traversal(neptune_endpoint, neptune_port, False)\n", " has_edges = True\n", " edge_count = None\n", " while has_edges:\n", " if edge_count is None:\n", " print('clearing property graph data [edge_batch_size={}, edge_count=Unknown]...'.format(edge_batch_size))\n", " else:\n", " print('clearing property graph data [edge_batch_size={}, edge_count={}]...'.format(edge_batch_size, edge_count))\n", " g.E().limit(edge_batch_size).drop().toList()\n", " edge_count = g.E().count().next()\n", " has_edges = (edge_count > 0)\n", " has_vertices = True\n", " vertex_count = None\n", " while has_vertices:\n", " if vertex_count is None:\n", " print('clearing property graph data [vertex_batch_size={}, vertex_count=Unknown]...'.format(vertex_batch_size))\n", " else:\n", " print('clearing property graph data [vertex_batch_size={}, vertex_count={}]...'.format(vertex_batch_size, vertex_count))\n", " g.V().limit(vertex_batch_size).drop().toList()\n", " vertex_count = g.V().count().next()\n", " has_vertices = (vertex_count > 0)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def get_person(g, person_id):\n", " person = g.V(person_id).limit(1).toList()\n", " return None if not person else person[-1]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def upsert_person(g, person):\n", " person_vertex = get_person(g, person['id'])\n", " elem = g.addV('person').property(T.id, person['id']).next() if not person_vertex else g.V(person_vertex).next()\n", " for k in ('id', 'name', 'email', 'phone_number', 'company', 'job_title'):\n", " g.V(elem).property(k, person[k]).next()\n", " g.V(elem).property('_name', person['name'].lower()).next()\n", "\n", " _from_person_id = hashlib.md5(person['owner'].encode('utf-8')).hexdigest()[:8]\n", " _to_person_id = person['id']\n", " if _from_person_id != _to_person_id:\n", " from_person_vertex = get_person(g, _from_person_id)\n", " to_person_vertex = get_person(g, _to_person_id)\n", " weight = 1.0\n", " if g.V(from_person_vertex).outE('knows').filter(__.inV().is_(to_person_vertex)).toList():\n", " print('Updating relationship')\n", " g.V(from_person_vertex).outE('knows').filter(__.inV().is_(to_person_vertex)).property('weight', weight).next()\n", " else:\n", " print('Creating relationship')\n", " g.V(from_person_vertex).addE('knows').to(to_person_vertex).property('weight', weight).next()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def _print_all_vertices(g):\n", " import pprint\n", " all_persons = [{**node.__dict__, **properties} for node in g.V()\n", " for properties in g.V(node).valueMap()]\n", " pprint.pprint(all_persons)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Neptune 데이터베이스 초기화¶" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "neptune_endpoint, neptune_port = (NEPTUNE_ENDPOINT, NEPTUNE_PORT)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#clear_graph(neptune_endpoint)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gremlin: ws://octember-bizcard.cluster-cnrh6fettief.us-east-1.neptune.amazonaws.com:8182/gremlin\n" ] } ], "source": [ "g = graph_traversal(neptune_endpoint, neptune_port)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{'_name': ['edy kim'],\n", " 'company': ['aws'],\n", " 'email': ['edy@amazon.com'],\n", " 'id': ['f75f761c'],\n", " 'job_title': ['Specialist Solutions Architect'],\n", " 'label': 'person',\n", " 'name': ['Edy Kim'],\n", " 'phone_number': ['(+82 10) 231 5467 ']},\n", " {'_name': ['pororo kim'],\n", " 'company': ['aws'],\n", " 'email': ['pororo@amazon.com'],\n", " 'id': ['a8f9f7c7'],\n", " 'job_title': ['SA Manager'],\n", " 'label': 'person',\n", " 'name': ['Pororo Kim'],\n", " 'phone_number': ['(+82 10)321 6547 ']},\n", " {'_name': ['poby kim'],\n", " 'company': ['aws'],\n", " 'email': ['poby@amazon.com'],\n", " 'id': ['6f371694'],\n", " 'job_title': ['Solutions Architect'],\n", " 'label': 'person',\n", " 'name': ['Poby Kim'],\n", " 'phone_number': ['(+82 10) 312 4567 ']},\n", " {'_name': ['rody park'],\n", " 'company': ['aws'],\n", " 'email': ['rody@amazon.com'],\n", " 'id': ['0679a6d8'],\n", " 'job_title': ['Solutions Architect'],\n", " 'label': 'person',\n", " 'name': ['Rody Park'],\n", " 'phone_number': ['(+82 10) 513 6754 ']},\n", " {'_name': ['crong lee'],\n", " 'company': ['aws'],\n", " 'email': ['crong@amazon.com'],\n", " 'id': ['1ee4a9f1'],\n", " 'job_title': ['Associate Solutions Architect'],\n", " 'label': 'person',\n", " 'name': ['Crong Lee'],\n", " 'phone_number': ['(+82 10)231 7546 ']},\n", " {'_name': ['harry jang'],\n", " 'company': ['aws'],\n", " 'email': ['harry@amazon.com'],\n", " 'id': ['3b87c97d'],\n", " 'job_title': ['Partner Solutions Architect'],\n", " 'label': 'person',\n", " 'name': ['Harry Jang'],\n", " 'phone_number': ['(+82 10) 213 4754 ']}]\n" ] } ], "source": [ "_print_all_vertices(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 인맥 관계도 그리기" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import networkx as nx\n", "\n", "plt.rcdefaults()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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LnFCj+s7an+Ao+Z7NO7/u3TPyogsK6IeXNirz1MqgOWzUvHUz8b61d69e/ciLS1NGk9ps9lQUlKCd98Vb7y8YsUKlJWV+bVvoqFAbn3ocLTi4rtL4G5qgDYhHZbCPwa2gT2QWx+IBgtneVNIyog3yQ6Tlz9eg7bz38LdJA7W1yVN/MkwCQCNn/0D9lOfS68FY2yXLrKedHiACfH+P6WitLQU+/btQ3R0NPR6Perq6qTuvoyMDCxfvtzvfRMNBf7WB8fFE7hcuRbu5qvwOO2AQonIafMD38AeyK0PRIOFgZJCUlZSNOKMWtTb/H9+raupAe6mBii14dCNuRfRuYt7v7GghsoUB/2YSTDdXwDhxqzS3jAbtZgyunfd6rdjtVrR2tqK06dPo7a2FgaDAampqcjPz0dxcTF0usANByAKRf7WB0+7A66rNYBSgDomAaYHnoBuVHo/tfL25NYHosHCLm8KWRv2nMLa3ScD0u09UJQK4Nmfp2DJ9J7vnUlE8rA+EA0sTsqhkFUwOSHkZjQrFAoUTE4Y7GYQDXmsD0QDi4GSQlacUYeH0y0QlKFx0hCUCjySbsEwY883Yici+VgfiAYWAyWFtN9MT0YojdpgVxbRwGF9IBo4DJQU0lItEVg6424E+zUIBYClD96FVEvET65LRIHB+kA0cBgoKeQtzhmLFIsxaLu2BKUCqRYjns7hfeWIBhrrA9HAYKCkkKcWlFhXMDGou7bWFkyEWuC/G9FAY30gGhj8BtOQMG54BFbOGdj7xfXWysfTMG44u7KIBgvrA1H/Y6CkIWP+lEQ8NytlsJvhY/msFBROSRzsZhDd8VgfiPoXAyUNKUtykrE8SE4ay2elYHEOZ20SBQvWB6L+wyfl0JD0wcEf8YePvgMAuAfwURmdA/9fejwN83nlgSgosT4QBR4DJQ1Z319qQsmWr3Gi1oaB+JIrAKRYjFhXMJFjooiCHOsDUWAxUNKQ1u7uwJt7T2N91SkA/XM1ovOqw9IH78LTOWM5W5MoRLA+EAUOAyXdEY7XNuEve37Ajm9r4fF4EIjzhlIhPnv3kXQLlkxP5k2JiUIU6wORfAyUdEept7Vhy//OY9OBH1Fvc6DzXse9OYEICsBzY904oxZF9yehYHICn71LNESwPhD5j4GS7kgudwe+qL6Koxca8U1NIw6fu4aLjW3drj/CpEPmqCiMH2nChHgTspKioWLXFdGQxPpA1HcMlEQ3NNrbUXPdDke7G053BzSCElq1gJGRepj06sFuHhENItYHop4xUBIRERGRLLwmT0RERESyMFASERERkSwMlEREREQkCwMlEREREcnCQElEREREsjBQEhEREZEsDJREREREJAsDJRERERHJwkBJRERERLIwUBIRERGRLAyURERERCQLAyURERERycJASURERESyMFASERERkSwMlEREREQkCwMlEREREcnCQElEREREsjBQEhEREZEsDJREREREJAsDJRERERHJwkBJRERERLIwUBIRERGRLAyURERERCQLAyURERERycJASURERESy/B9DDdaqbhAxmgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dg = nx.DiGraph()\n", "\n", "path_list = g.V().out().path().by('name').toList()\n", "for e in path_list:\n", " dg.add_edge(e[0], e[1])\n", "nx.draw(dg, pos=nx.circular_layout(dg), with_labels=True, node_size=1200, width=2, font_weight='bold')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'company': ['aws'],\n", " 'email': ['harry@amazon.com'],\n", " 'job_title': ['Partner Solutions Architect'],\n", " 'name': ['Harry Jang'],\n", " 'phone_number': ['(+82 10) 213 4754 '],\n", " 'score': 3.0}\n", "{'company': ['aws'],\n", " 'email': ['crong@amazon.com'],\n", " 'job_title': ['Associate Solutions Architect'],\n", " 'name': ['Crong Lee'],\n", " 'phone_number': ['(+82 10)231 7546 '],\n", " 'score': 3.0}\n" ] } ], "source": [ "import pprint\n", "\n", "user = 'Poby Kim'.lower()\n", "recommendations = (g.V().hasLabel('person').has('_name', user).as_('person')\n", " .both('knows').aggregate('friends')\n", " .both('knows').where(P.neq('person')).where(P.without('friends'))\n", " .groupCount().by('id')\n", " .order(Scope.local)\n", " .by(Column.values, Order.decr)\n", " .next())\n", "\n", "res = []\n", "for key, score in recommendations.items():\n", " value = {k: v for k, v in g.V(key).valueMap().next().items() if not (k == 'id' or k.startswith('_'))}\n", " value['score'] = float(score)\n", " res.append(value)\n", "\n", "for e in res:\n", " pprint.pprint(e)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }