18.7 SELECT問合せを実行するためのJava API
このセクションでは、グラフ・サーバー(PGX)でSELECT
問合せを実行するためのAPIについて説明します。
- グラフ・サーバー(PGX)のグラフに対するSELECT問合せの実行
PgxGraph.queryPgql(String query)
メソッドは、現在のセッションで問合せを実行します。このメソッドは、PgqlResultSet
を返します。 - PGXセッションに対するSELECT問合せの実行
PgxSession.queryPgql(String query)
メソッドは、セッションで指定された問合せを実行し、PgqlResultSet
を返します。 - 結果セットの反復処理
結果セットを反復処理するには、JDBCに似た方法またはJava Iteratorインタフェースを使用する方法があります。 - 結果セットの出力
PgqlResultSet (パッケージoracle.pgx.api)
の次のメソッドは、結果セットを出力するために使用されます。
親トピック: グラフ・サーバー(PGX)に対するPGQL問合せの実行
18.7.1 グラフ・サーバー(PGX)のグラフに対するSELECT問合せの実行
PgxGraph.queryPgql(String query)
メソッドは、現在のセッションで問合せを実行します。このメソッドは、PgqlResultSet
を返します。
問合せはPGXグラフに対して直接実行されるため、MATCH
句内のON
句は省略できます。同じ理由で、INSERT
句内のINTO
句は省略できます。ただし、ON
句およびINTO
句でグラフ名を明示的に指定する場合、これらのグラフ名がグラフの実際の名前(PgxGraph.getName()
)と一致している必要があります。
親トピック: SELECT問合せを実行するためのJava API
18.7.2 PGXセッションに対するSELECT問合せの実行
PgxSession.queryPgql(String query)
メソッドは、セッションで指定された問合せを実行し、PgqlResultSet
を返します。
MATCH
句内のON
句、およびINSERT
句内のINTO
句は、指定する必要があり、省略できません。この時点では、単一の問合せで複数のグラフのデータを結合することはまだサポートされていないため、問合せのすべてのON
句およびINTO
句で同じグラフを参照する必要があります。
親トピック: SELECT問合せを実行するためのJava API
18.7.3 結果セットの反復処理
結果セットを反復処理するには、JDBCに似た方法またはJava Iteratorインタフェースを使用する方法があります。
JDBCのような反復の場合、PgqlResultSet
(パッケージoracle.pgx.api
)のメソッドはjava.sql.ResultSet
のメソッドと似ています。主な違いは、PGQLの結果セット・インタフェースはJava 8で導入された新しい日時ライブラリに基づいているのに対し、java.sql.ResultSet
はレガシーjava.util.Date
に基づいていることです。ギャップを埋めるために、PGQLの結果セットは、java.util.Date
をまだ使用しているアプリケーションにgetLegacyDate(..)
を提供します。
PgqlResultSet
には、最初の行の前に初期設定されるcursor
があります。その後、次のメソッドを使用してカーソルを再配置できます。
next() : boolean
previous() : boolean
beforeFirst()
afterLast()
first() : boolean
last() : boolean
absolute(long row) : boolean
relative(long rows) : boolean
getObject(int columnIdx) : Object
getObject(String columnName) : Object
getString(int columnIdx) : String
getString(String columnName) : String
getInteger(int columnIdx) : Integer
getInteger(String columnName) : Integer
getLong(int columnIdx) : Long
getLong(String columnName) : Long
getFloat(int columnIdx) : Float
getFloat(String columnName) : Float
getDouble(int columnIdx) : Double
getDouble(String columnName) : Double
getBoolean(int columnIdx) : Boolean
getBoolean(String columnName) : Boolean
getVertexLabels(int columnIdx) : Set<String>
getVertexLabels(String columnName) : Set<String>
getDate(int columnIdx) : LocalDate
getDate(String columnName) : LocalDate
getTime(int columnIdx) : LocalTime
getTime(String columnName) : LocalTime
getTimestamp(int columnIdx) : LocalDateTime
getTimestamp(String columnName) : LocalDateTime
getTimeWithTimezone(int columnIdx) : OffsetTime
getTimeWithTimezone(String columnName) : OffsetTime
getTimestampWithTimezone(int columnIdx) : OffsetDateTime
getTimestampWithTimezone(String columnName) : OffsetDateTime
getLegacyDate(int columnIdx) : java.util.Date
getLegacyDate(String columnName) : java.util.Date
getVertex(int columnIdx) : PgxVertex<ID>
getVertex(String columnName) : PgxVertex<ID>
getEdge(int columnIdx) : PgxEdge
getEdge(String columnName) : PgxEdge
詳細は、Java ドキュメントを参照してください。
最後に、結果セットのリソースを解放するPgqlResultSet.close()
があり、PgqlResultSet.getMetaData()
を使用して列名と列数を取得できます。
結果セットの反復の例は次のとおりです。
PgqlResultSet resultSet = g.queryPgql(
" SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita "
+ " FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) "
+ " , MATCH (account1) -[t:transaction]- (account2) "
+ " , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) "
+ " WHERE p.name = 'Nikita' "
+ " GROUP BY owner");
while (resultSet.next()) {
String accountHolder = resultSet.getString(1);
long totalTransacted = resultSet.getLong(2);
System.out.println(accountHolder + ": " + totalTransacted);
}
resultSet.close();
前述の例の出力は次のようになります。
Oracle: 4501
Camille: 1000
さらに、PgqlResultSet
もJava Iteratorインタフェースを介して反復可能です。結果セットに対する"for each loop"の例は、次のとおりです。
for (PgxResult result : resultSet) {
String accountHolder = result.getString(1);
long totalTransacted = result.getLong(2);
System.out.println(accountHolder + ": " + totalTransacted);
}
前述の例の出力は次のようになります。
Oracle: 4501
Camille: 1000
PgqlResultSet
で使用可能なものと同じgetterをPgxResult
でも使用できることに注意してください。
親トピック: SELECT問合せを実行するためのJava API
18.7.4 結果セットの出力
PgqlResultSet (パッケージoracle.pgx.api)
の次のメソッドは、結果セットを出力するために使用されます。
print() : PgqlResultSet
print(long numResults) : PgqlResultSet
print(long numResults, int from) : PgqlResultSet
print(PrintStream printStream, long numResults, int from) : PgqlResultSet
たとえば:
g.queryPgql("SELECT COUNT(*) AS numPersons FROM MATCH (n:Person)").print().close()
+------------+
| numPersons |
+------------+
| 3 |
+------------+
もう1つ例を示します:
PgqlResultSet resultSet = g.queryPgql(
" SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita "
+ " FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) "
+ " , MATCH (account1) -[t:transaction]- (account2) "
+ " , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) "
+ " WHERE p.name = 'Nikita' "
+ " GROUP BY owner")
resultSet.print().close()
+-----------------------------------------------+
| account_holder | total_transacted_with_Nikita |
+-----------------------------------------------+
| Camille | 1000.0 |
| Oracle | 4501.0 |
+-----------------------------------------------+
親トピック: SELECT問合せを実行するためのJava API