15.9.1 構文

トリビアルな式

常にtrueに評価されます。

true

常にfalseに評価されます。

false

定数

有効な定数は、整数と長整数、単精度および倍精度の浮動小数点数に加えて、文字列リテラル、truefalseです。長整数型の定数の末尾には、lまたはLを付ける必要があります。浮動小数点数は、デフォルトでは倍精度数値として扱われます。特定の精度を強制するために、単精度にはfまたはFを使用し、倍精度浮動小数点数にはdまたはDを使用できます。文字列リテラルは、一重引用符または二重引用符で囲まれたUTF-8の文字列です。

25
4294967296L
0.62f
0.33d
"Double quoted string"
'Single quoted string'

頂点およびエッジ識別子

フィルタ・タイプに応じて、異なる識別子が有効です。

頂点フィルタ

頂点フィルタ式には、現在のコンテキストの頂点を指すキーワードが1つのみ含まれます。

vertexは、フィルタ式によって現在評価されている頂点を示します。

vertex

エッジ・フィルタ

エッジ・フィルタ式には、現在のコンテキストのエッジまたはその頂点を指す複数のキーワードが含まれます。

edgeは、フィルタ式によって現在評価されているエッジを示します。

edge

dstは、現在のエッジの入力頂点を示します。dstはサブグラフ・コンテキストでのみ有効です。

dst

srcは、現在のエッジの出力頂点を示します。srcはサブグラフ・コンテキストでのみ有効です。

src

プロパティ

フィルタ式は、頂点およびエッジ・プロパティの値にアクセスできます。

<id>.<property>

説明:

  • <id>: 任意の頂点またはエッジ識別子(つまり、srcdstvertexedge)です。
  • <property>: 頂点またはエッジ・プロパティの名前です。

    ノート:

    識別子がedgeである場合、これはエッジ・プロパティの名前である必要があります。それ以外の場合は、頂点プロパティである必要があります。

プロパティ名がフィルタ式構文の予約名であるか、スペースを含んでいる場合は、一重引用符または二重引用符で囲む必要があります。

次のコードは、出力頂点のcostプロパティにアクセスします。

src.cost

Temporalプロパティでは、特殊なコンストラクタを使用した値の比較(定数およびプロパティ値)がサポートされています。デフォルトのTemporal形式を次の表に示します。

表15-4 デフォルトのTemporal形式

プロパティ・タイプ コンストラクタ
DATE date ('yyyy-MM-dd HH:mm:ss')
LOCAL_DATE date 'yyyy-MM-dd'
TIME time 'HH:mm:ss'
TIME_WITH_TIMEZONE time 'HH:mm:ss+/-XXX'
TIMESTAMP timestamp 'yyyy-MM-dd HH:mm:ss'
TIMESTAMP_WITH_TIMEZONE timestamp 'yyyy-MM-dd HH:mm:ss+/-XXX'

次の式は、エッジのプロパティtimestamp_withTZにアクセスし、それが3/27/2007 06:00+01:00と等しいかどうかをチェックします。

edge.timestamp_withTZ = timestamp'2007-03-2706:00:00+01:00'

ノート:

タイプdateプロパティは等価性についてのみチェックできます。dateタイプの使用はバージョン2.5から非推奨となったため、かわりに、すべての操作をサポートするlocal dateまたはtimestampタイプを使用してください。

メソッド

フィルタ式では次の関数がサポートされています。

Degree関数

  1. outDegree()は、頂点識別子の出力エッジの数を返します。degree()は、outDegreeのシノニムです。
    int <id>.degree()
    int <id>.outDegree()

    次の例は、出力頂点のout-degreeが3より大きいかどうかを確認します。

    src.degree() > 3
  2. inDegree()は、頂点識別子の入力エッジの数を返します。
    int <id>.inDegree()

Label関数

  1. hasLabel()は、頂点にラベルがあるかどうかをチェックします。
    boolean <id>.hasLabel('<label>')

    次の例は、頂点にラベルcityがあるかどうかを確認します。

    vertex.hasLabel('city')
  2. label()は、エッジのラベルを返します。
    string <id>.label()

    次の式は、エッジのラベルがclicked_byであるかどうかをチェックします。

    edge.label() = 'clicked_by'

関係式

値(プロパティ値や定数など)を比較するために、フィルタ式では、次に示す比較演算子が提供されます。ノート: ===は両方ともシノニムです。

==
=
!=
<
<=
>
>=

次の例は、出力頂点のcostプロパティが1.23以下であるかどうかをチェックします。

src.cost <= 1.23

頂点IDの比較

特定の頂点IDを持つ頂点についてフィルタすることもできます。

<id> = <vertex_id>

次の例は、エッジの出力頂点が頂点ID San Franciscoを持つかどうかを確認します

src = "San Francisco"

正規表現

正規表現を使用して、文字列を照合できます。

<string expression> =~ '<regularexpression>'

次の例は、エッジ・ラベルが小文字で始まり、数字で終わるかどうかをチェックします。

edge.label() =~ '^[a-z].*[0-9]$'

ノート:

右側のパターンは、Java REGEXの構文に準拠しています。

型変換

次の構文を使用すると、<expression>の型を<type>に変換できます。

(<type>) <expression>

次の例は、出力頂点のcostプロパティの値を整数値に変換します。

(int) src.cost

ブール式

フィルタ式を合成して、他のフィルタ式を形成できます。これを行うには、ブール演算子&& (and)、|| (or)および! (not)を使用します。

ノート:

ブール・オペランドのみを合成できます。
(! true) || false
edge.cost < INF && dst.visited = false
src.degree() < 10 || !(dst.visited)

算術式

算術式を使用して、任意の数値式を組み合せることができます。使用可能な算術演算子は、+-*/%です。

ノート:

これらの演算子は数値オペランドでのみ機能します。
1 + 5
-vertex.degree()
edge.cost * 2 > 5
src.value * 2.5 = (dst.inDegree() + 5) / dst.outDegree()

演算子の優先順位

次のリストに、最も高い優先順位から最も低い優先順位へと順番に演算子の優先順位を示します。上位の演算子は、下位の演算子よりも先に評価されます。

  1. + (単項プラス)、- (単項マイナス)
  2. *,/, %
  3. +, -
  4. =,!=, <, >, <=, >=, =~
  5. NOT
  6. AND
  7. OR

糖衣構文

bothおよびanyは、現在のエッジの出力および入力頂点を示します。これらを使用して、2つの頂点のうちの両方または少なくともどちらか一方についてtrueである必要がある条件を表すことができます。これらのキーワードは、エッジ・フィルタ式でのみ有効です。頂点フィルタで使用すると、ランタイム・タイプ・チェック例外が発生します。

both
any

次の例の中のフィルタ式は同等です。

both.property = 1
src.property = 1 && dst.property = 1
any.degree() > 1
src.degree() > 1 || dst.degree() > 1