11 RDFグラフのプロパティ・グラフ・ビュー

Oracle Graphでは、RDFグラフ・データ・モデルに加えて、プロパティ・グラフ・データ・モデルもサポートされています。

プロパティ・グラフ・データ・モデルは、グローバルなリソース識別(つまりURI)やフォーマルなセマンティクスや推論という概念がないため、RDFデータ・モデルよりも単純です。さらに、プロパティ・グラフではプロパティ(キーと値のペア)をエッジと直接関係付けることができます。それとは対照的に、RDFでプロパティをエッジと関係付けるには、具象化、つまりクワッド・データ・モデルが必要になります(RDFトリプル)。

Oracle Databaseのプロパティ・グラフ機能(『Oracle Databaseプロパティ・グラフ開発者ガイド』プロパティ・グラフの概要を参照)は、60近くの事前作成済アルゴリズムによる分析機能をサポートしています。RDFグラフでプロパティ・グラフ・ビューを作成することで、RDFグラフでこの機能を使用できます。

プロパティ・グラフ問合せ言語(PGQL)でサポートされているCREATE PROPERTY GRAPH DDL文(PGQLを使用したプロパティ・グラフの作成を参照)は、データベースのリレーショナル・データを使用してプロパティ・グラフを作成します。プロパティ・グラフの頂点とエッジは、DDL文で提供されている頂点およびエッジ表から導出されます。そのため、RDFデータに対してSEM_MATCH問合せを実行して、頂点表およびエッジ表を表すデータベース・ビューを作成できます。

また、次の点にも注意してください。

  • 頂点ビューおよびエッジ・ビューには、主キー列および属性が必要です。SPARQLパターンで複数値プロパティを使用する場合、同じ主キー(通常は頂点表で繰り返されるサブジェクト)を持つ行が繰り返されることがあります。このようなプロパティの場合は、エッジを作成するか、JSON_ARRAYAGGなどの集計を使用して複数値プロパティを1行に縮小する必要があります。
  • グラフ・アルゴリズムを実行するグラフ・サーバー(PGX)は、コンポジット主キーを処理できません。そのため、(sourceIddestinationId)をキーとして使用するのではなく、エッジ表に対して単一のキー列を作成する必要があります。

例11-1 RDFデータからのPGQLプロパティ・グラフの作成

前提条件: 次の例では、MOVIESTREAM RDFデータを使用し、このデータが、RDFUSERが所有するRDF_NETWORKという名前のネットワーク内のMOVIESTREAMというRDFグラフにロードされることを前提としています。SQL Developerを使用したRDFデータのバルク・ロードの詳細は、「SQL Developerを使用したRDFデータのバルク・ロード」を参照してください。

RDFデータを使用してPGQLプロパティ・グラフを作成するには、次のステップを実行します:

  1. SEM_MATCH問合せを実行して、頂点表およびエッジ表を表すビューを作成します。
    次のコード例では、次に示すように、頂点表およびエッジ表に対応するデータベース・ビューを生成します。
    • 頂点表: MOVIEGENRE
    • エッジ表: HAS_GENRE
    /* Vertex Table: Movie
    http://www.example.com/moviestream/Movie
      - http://www.example.com/moviestream/title
      - http://www.example.com/moviestream/sku
      - http://www.example.com/moviestream/year
      - http://www.example.com/moviestream/views
      - http://www.example.com/moviestream/summary
      - http://www.example.com/moviestream/runtimeInMin
      - http://www.example.com/moviestream/grossInUSD
      - http://www.example.com/moviestream/budgetInUSD
      - http://www.example.com/moviestream/openingDate
    */
    
    create or replace view movie(id, title, summary, year, openingDate, runtimeinMin, grossInUSD, budgetInUSD, views) as
    select movie$rdfvid id,
           title,
           summary,
           cast(year as number default null on conversion error) year,
           to_timestamp(openingDate default null on conversion error, 'SYYYY-MM-DD') openingDate,
           cast(runtimeInMin as number default null on conversion error) runtimeinMin,
           cast(grossInUSD as number default null on conversion error) grossInUSD,
           cast(budgetInUSD as number default null on conversion error) budgetInUSD,
           cast(views as number default null on conversion error) views
    from table(sem_match(
    'PREFIX ms: <http://www.example.com/moviestream/>
     SELECT *
     WHERE {
       ?movie ms:title ?title .
       OPTIONAL { ?movie ms:summary ?summary }
       OPTIONAL { ?movie ms:sku ?sku }
       OPTIONAL { ?movie ms:year ?year }
       OPTIONAL { ?movie ms:openingDate ?openingDate }
       OPTIONAL { ?movie ms:runtimeInMin ?runtimeInMin }
       OPTIONAL { ?movie ms:grossInUSD ?grossInUSD }
       OPTIONAL { ?movie ms:budgetInUSD ?budgetInUSD }
       OPTIONAL { ?movie ms:views ?views }
     }',
    sem_models('moviestream'),
    null,null,null,null,
    ' DO_UNESCAPE=T ',
    null,null,
    'RDFUSER','RDF_NETWORK'));
    
    /* Vertex Table: Genre
     
    http://www.example.com/moviestream/Genre
      - http://www.example.com/moviestream/genreName
    */
    create or replace view genre(id, genreName) as
    select genre$rdfvid id, genreName
    from table(sem_match(
    'PREFIX ms: <http://www.example.com/moviestream/>
     SELECT ?genre ?genreName
     WHERE {
       ?genre ms:genreName ?genreName . }',
    sem_models('moviestream'),
    null,null,null,null,
    ' DO_UNESCAPE=T ',
    null,null,
    'RDFUSER','RDF_NETWORK'));
    
    /*
    Edge Table: has_genre
    (:Movie) -[http://www.example.com/moviestream/genre]-> (:Genre)
    */
    create or replace view has_genre(id, movieId, genreId) as
    select (to_char(movie$rdfvid)||to_char(genre$rdfvid)) as id, movie$rdfvid movieId, genre$rdfvid genreId
    from table(sem_match(
    'PREFIX ms: <http://www.example.com/moviestream/>
     SELECT *
     WHERE {
       ?movie ms:genre ?genre .
     }',
    sem_models('moviestream'),
    null,null,null,null,
    ' DO_UNESCAPE=T ',
    null,null,
    'RDFUSER','RDF_NETWORK'));
  2. ビューを使用してPGQLプロパティ・グラフを作成します。

    PGQLプロパティ・グラフは、グラフ・サーバーおよびクライアント・リリースに同梱されているグラフ・クライアントを使用するか、SQLクライアント・ツール(SQLclまたはSQL Developer)を使用して作成できます。

    次の例では、SQL DeveloperPGQLワークシートを使用してMOVIESプロパティ・グラフを作成します。

    CREATE PROPERTY GRAPH MOVIES
    VERTEX TABLES (
      MOVIE KEY(ID) LABEL MOVIE PROPERTIES ARE ALL COLUMNS,
      GENRE KEY(ID) LABEL GENRE PROPERTIES ARE ALL COLUMNS
    )
    EDGE TABLES (
      HAS_GENRE KEY(ID)
        SOURCE KEY (MOVIEID) REFERENCES MOVIE(ID)
        DESTINATION KEY (GENREID) REFERENCES GENRE(ID)
        LABEL HAS_GENRE PROPERTIES ARE ALL COLUMNS
     ) OPTIONS (PG_PGQL)

プロパティ・グラフでグラフ・アルゴリズムを問い合せ、ビジュアル化および実行できるようになりました。

グラフ・サーバー(PGX)を使用したRDFグラフおよびRDFデータ・ビジュアライゼーションでのグラフ・アルゴリズムの実行

Oracle Graphのグラフ・サーバー(PGX)を使用すると、プロパティ・グラフでグラフ・アルゴリズムを実行できます。したがって、ビュー内のRDFデータを使用して作成されたプロパティ・グラフ(例11-1を参照)をグラフ・サーバー(PGX)にロードし、グラフ分析を実行できます。また、グラフ・ビジュアライゼーションWebクライアントを使用してRDFデータをビジュアル化することもできます。これらの操作を実行するには、グラフ・サーバー(PGX)をインストールする必要があります。

関連項目:

例11-2 RDFグラフおよびRDFデータ・ビジュアライゼーションでのグラフ・アルゴリズムの実行

前提条件: この例を実行するための次の前提条件を満たす必要があります。
  1. RDFデータにデータベース・ビューを作成してPGQLプロパティ・グラフを作成します(例11-1を参照)。
  2. SYSDBAユーザーとして、GRAPH_DEVELOPERロールをRDFUSERに付与します。

次の例では、Javaクライアントを使用してプロパティ・グラフをグラフ・サーバー(PGX)にロードし、PageRankアルゴリズムを実行して上位10個のムービーをリストします。

For an introduction type: /help intro
Oracle Graph Server Shell 24.2.0
Variables instance, session, and analyst ready to use.
opg4j> var graph = session.readGraphByName("MOVIES", GraphSource.PG_PGQL,ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE))
graph ==> PgxGraph[name=MOVIES,N=3823,E=7617,created=1714231298337]
opg4j> analyst.pagerank(graph)
$3 ==> VertexProperty[name=pagerank,type=double,graph=MOVIES]
opg4j> session.queryPgql("SELECT a.title, a.pagerank FROM MATCH (a:movie) ON MOVIES ORDER BY a.pagerank DESC LIMIT 10").print()
+-------------------------------------------------------+
| title                         | pagerank              |
+-------------------------------------------------------+
| Gang Cops                     | 3.9236201935652636E-5 |
| Blood Street                  | 3.9236201935652636E-5 |
| The Girl on the Train         | 3.9236201935652636E-5 |
| The Girl with the Hungry Eyes | 3.9236201935652636E-5 |
| Debonair Dancers              | 3.9236201935652636E-5 |
| Honky                         | 3.9236201935652636E-5 |
| Edith's Shopping Bag          | 3.9236201935652636E-5 |
| Believe                       | 3.9236201935652636E-5 |
| Taking Liberties              | 3.9236201935652636E-5 |
| Batman Fights Dracula         | 3.9236201935652636E-5 |
+-------------------------------------------------------+
$5 ==> PgqlResultSetImpl[graph=MOVIES,numResults=10]

また、次の図に示すように、グラフ・サーバー(PGX)でグラフ(opg4j> graph.publish())を公開し、「グラフ・ビジュアライゼーション・アプリケーションの使用」でPGQL問合せを実行できます。ビジュアライゼーションの例は、Sci-Fiジャンルに属するすべてのムービーを示しています。

図11-1 RDFデータ・ビジュアライゼーション