11 RDFグラフからのプロパティ・グラフの作成

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

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

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

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

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

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

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

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

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

  1. SEM_MATCH問合せを実行して、頂点表およびエッジ表を作成します。

    SQLプロパティ・グラフ問合せのパフォーマンスを向上させるために、これらの表に索引を作成することをお薦めします。PGQLプロパティ・グラフを作成する場合は、頂点およびエッジに対してビューまたは表を作成できます。次のコード例では、頂点表およびエッジ表に対応するデータベース表を生成しています。

    • 頂点表: 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 table 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 table 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 table has_genre(has_genre_id, movieId, genreId) as
    select (to_char(movie$rdfvid)||to_char(genre$rdfvid)) as has_genre_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. その表を使用してSQLまたはPGQLプロパティ・グラフを作成します。

    SQLプロパティ・グラフを作成するには:

    次の例では、MOVIES SQLプロパティ・グラフを作成します。SQLクライアント・ツールのいずれかを使用して、SQLプロパティ・グラフを作成できます。

    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(HAS_GENRE_ID)
        SOURCE KEY (MOVIEID) REFERENCES MOVIE(ID)
        DESTINATION KEY (GENREID) REFERENCES GENRE(ID)
        LABEL HAS_GENRE PROPERTIES ARE ALL COLUMNS
     )

    PGQLプロパティ・グラフを作成するには:

    次の例では、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(HAS_GENRE_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データにデータベース・ビューを作成してSQLプロパティ・グラフを作成します(例11-1を参照)。
  2. SYSDBAユーザーとして、GRAPH_DEVELOPERロールをRDFUSERに付与します。

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

For an introduction type: /help intro
Oracle Graph Server Shell 25.3.0
Variables instance, session, and analyst ready to use.
opg4j> var graph = session.readGraphByName("MOVIES", GraphSource.PG_SQL,ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE))
graph ==> PgxGraph[name=MOVIES,N=3823,E=7617,created=1751789231753]
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              |
+--------------------------------------------------+
| Mortuary                 | 3.9236201935652636E-5 |
| Karla                    | 3.9236201935652636E-5 |
| Thor: The Dark World     | 3.9236201935652636E-5 |
| August: Osage County     | 3.9236201935652636E-5 |
| Schoolgirl Apocalypse    | 3.9236201935652636E-5 |
| Talk Radio               | 3.9236201935652636E-5 |
| Frozen River             | 3.9236201935652636E-5 |
| Raising Buchanan         | 3.9236201935652636E-5 |
| The Stand Up             | 3.9236201935652636E-5 |
| Chronically Metropolitan | 3.9236201935652636E-5 |
+--------------------------------------------------+
$3 ==> PgqlResultSetImpl[graph=MOVIES,numResults=10]

または、次の図に示すように、グラフ・ビジュアライゼーション・アプリケーションを使用して、SQLプロパティ・グラフをグラフ・サーバー(PGX)にロードし、PGQL問合せを実行できます。ビジュアライゼーションの例は、Sci-Fiジャンルに属するすべてのムービーを示しています。

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