11.5 SqlGraphVisualizationおよびPgxGraphVisualizationの使用例

対話型のグラフ・ビジュアライゼーション用のoraclegraph Jupyterウィジェットを使用して、SQLプロパティ・グラフの問合せをビジュアル化できます。さらに、グラフ・サーバー(PGX)にグラフをロードし、PGQL問合せを実行して、グラフをビジュアル化することもできます。

次のステップは、グラフ・ビジュアライゼーション拡張機能を使用して、Jupyter環境(Jupyter NotebookまたはJupyterLab)でSQLプロパティ・グラフをビジュアル化および操作する方法を示しています。この手順では、Oracle AI Database 26aiにすでにSQLプロパティ・グラフが作成されていることを前提としています。次の例は、データベース表のグラフ・サーバーのインストール時に提供されているサンプル銀行グラフ・データ(サンプル・グラフ・データの使用を参照)に基づいています。

  1. 新しいノートブックを開き、Python oracledbドライバを使用してOracle AI Database 26aiへの接続を確立します。
    import oracledb
    connection = connection=oracledb.connect(
    user=graphuser,
    password="<password_for_graph_user>",
    dsn="<hostname:port/dbservice>",
    print("Connection established successfully.")
  2. プロパティ・グラフに対してSQLグラフ問合せを実行し、グラフ・ビジュアライゼーション拡張機能を使用して問合せ結果をビジュアル化します。
    たとえば、次の例では、BANK_GRAPHに対してSQLグラフ問合せを実行し、oraclegraph拡張機能を使用して問合せ結果のビジュアライゼーションを生成しています。
    from oraclegraph import GraphVisualization, SqlGraphVisualization
    
    # Define the query to fetch graph data
    query='''
    SELECT * FROM GRAPH_TABLE (bank_graph
    MATCH
    (a WHERE a.ID=816) -[e]-> (b)
    COLUMNS (vertex_id(a) AS id_a, edge_id(e) AS id_e, vertex_id(b) AS id_b )
    )
    '''
    
    # Initialize SqlGraphVisualization with the connection
    vq = SqlGraphVisualization(connection)
    
    # Execute the query
    graph_query = vq.visual_query(query)
    
    defaults_feature = {
      "interactionActive": True,
      "1stickyActive": True
    }
    
    base_styles = {
      "vertex": {
        "label": "${properties.ID}",
        "size": 20
      },
      "edge": {
        "label": "${properties.AMOUNT}"
      }
    }
    
    rule_based_styles = [{
        "stylingEnabled": True,
        "component": "vertex",
        "target": "vertex",
        "conditions": {
          "conditions": [{
            "property": "BALANCE",
            "operator": "<=",
            "value": 5000
          }],
        },
        "style": {
          "color": "green"
        },
        "legendTitle": "Balance Filter",
        "legendDisplayed": True
      }
    
    ]
    
    settings = {
      "numberOfHops": 2,
      "showLegend": True,
      "defaults": defaults_feature,
      "baseStyles": base_styles,
      "ruleBasedStyles": rule_based_styles
    }
    
    # Create and display the graph widget
    bank_graph = GraphVisualization(data = graph_query, settings = settings)
    bank_graph.height = 600
    display(bank_graph)

    前述のコードによるビジュアライゼーションの結果は次のようになります:

    図11-3 SQLプロパティ・グラフ問合せのビジュアライゼーション



  3. グラフ・サーバー(PGX)にグラフをロードし、グラフ分析を実行します。

    次の例では、グラフをグラフ・サーバー(PGX)にロードし、グラフに対してPagerankアルゴリズムを実行します。

    from oraclegraph import PgxGraphVisualization
    from pypgx import setloglevel
    from opg4py import graph_server
    
    setloglevel("ROOT", "WARN")
    
    base_url = "https://localhost:7007"
    username = "graphuser"
    password = "<password_for_graphuser>"
    
    # Connect to graph server and create a session
    instance = graph_server.get_instance(base_url, username, password)
    session = instance.create_session("jupyter_session")
    
    loaded_graph = session.read_graph_by_name("BANK_GRAPH", "pg_sql")
    
    analyst = session.create_analyst()
    pagerank = analyst.pagerank(loaded_graph, rank = "pagerank")
    result_set = loaded_graph.query_pgql("SELECT x, x.pagerank MATCH (x) ORDER BY x.pagerank DESC LIMIT 10")
    result_set.print()

    このコードによって生成される出力は、次のとおりです。

    +-----------------------------------------------------------------------------------------+
    | x                                                               | x.pagerank            |
    +-----------------------------------------------------------------------------------------+
    | PgxVertex[provider=BANK_ACCOUNTS,key=387,ID=BANK_ACCOUNTS(387)] | 0.007292323575404966  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=406,ID=BANK_ACCOUNTS(406)] | 0.006730094462320363  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=135,ID=BANK_ACCOUNTS(135)] | 0.0067205459831892545 |
    | PgxVertex[provider=BANK_ACCOUNTS,key=934,ID=BANK_ACCOUNTS(934)] | 0.0066348438503635795 |
    | PgxVertex[provider=BANK_ACCOUNTS,key=397,ID=BANK_ACCOUNTS(397)] | 0.005693569761570974  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=559,ID=BANK_ACCOUNTS(559)] | 0.005258438311460985  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=352,ID=BANK_ACCOUNTS(352)] | 0.005216329599236731  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=330,ID=BANK_ACCOUNTS(330)] | 0.005093350408942337  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=222,ID=BANK_ACCOUNTS(222)] | 0.004682551613749817  |
    | PgxVertex[provider=BANK_ACCOUNTS,key=4,ID=BANK_ACCOUNTS(4)]     | 0.004569682370461632  |
    +-----------------------------------------------------------------------------------------
  4. グラフ・サーバー(PGX)のグラフに対してPGQL問合せを実行し、グラフ・ビジュアライゼーション拡張機能を使用して問合せ結果をビジュアル化します。
    props={'size': 40}
    # Initialize PgxGraphVisualization with the session
    vq = PgxGraphVisualization(session=session)
    
    base_styles = {
      "vertex": {
        "label": "${properties.ID}",
        "size": 10
      },
      "edge": {
        "label": "${properties.AMOUNT}"
      }
    }
    
    settings = {
        "showLegend": True,
        "baseStyles": base_styles,
    }
     
    
    query = '''
    SELECT * FROM MATCH (v1)-[e]->(v2) ON {graph_name} LIMIT 100
    '''.format(graph_name=loaded_graph.name)
    
    # Fetch graph data as JSON
    json = vq.visualize_query(query)
    
    # Create and display the graph widget
    graph = GraphVisualization(data=json, settings=settings)
    graph.height = 800
    display(graph)

    前述のコードによるビジュアライゼーションの結果は次のようになります:

    図11-4 グラフ・サーバー(PGX)でのグラフ・ビジュアライゼーション