見出し画像

Neo4j GraphDBブートキャンプ完全版: 述語関数 (セクション34/49)

  • Neo4jのCypherクエリ言語には、グラフ内のノードとリレーションシップをフィルタリングするための述語関数が多数用意されている。

  • all()、any()、exists()、not exists()、none()、single()などの関数により、指定された条件に基づいてパターンマッチを絞り込むことができる。

  • これらの関数をWHERE句やパス要素を表す変数と組み合わせることで、グラフデータに対する複雑な条件を表現し、インサイトを得ることができる。

Neo4jのCypherクエリ言語には、グラフ内のノードとリレーションシップを指定された条件に基づいてフィルタリングできる便利な述語関数が多数用意されています。この記事では、2024年版のComplete Neo4j GraphDBブートキャンプのセクション34で取り上げられている重要な述語関数のいくつかを掘り下げていきます。

ここでは、異なる職業、年齢、国籍の人々を表すノードを持つグラフを使用します。ノードは、:KNOWS、:LOVES、:FOLLOWSの各リレーションシップによって接続されています。

all()関数

all()関数は、与えられたセット内のすべての要素が指定された条件を満たすことを要求します。例えば、すべてのノードの年齢が40歳未満である1~5ホップのパスを返すには、次のようにします。

MATCH p=(a)-[*1..5]->(b)
WHERE all(x IN nodes(p) WHERE x.age < 40)
RETURN p

これにより、パスp内の各ノードに変数xが割り当てられます。すべてのxノードのage属性値が40未満の場合にのみ、パスが返されます。

any()関数

any()関数は、セット内の少なくとも1つの要素が条件を満たす場合にtrueを返します。「Peter」ノードから「Abu」ノードへのパスで、「Rita」という名前のノードを通過するパスを見つけるには、次のようにします。

MATCH p =(a)-[*1..3]->(b)
WHERE a.name = 'Peter' AND b.name = 'Abu' AND any(x IN nodes(p) WHERE x.name = "Rita")
RETURN p

exists()関数とnot exists()関数

exists()は、ノード、リレーションシップ、またはパスに対して条件が真であるかどうかをチェックします。この例では、name属性が設定されているノードを返します。

MATCH (n)
WHERE EXISTS (n.name)
RETURN n.name

not exists()はその逆で、条件が偽であるノード/リレーションシップを返します。発信する:FOLLOWSリレーションシップを持たないノードを取得するには、次のようにします。

MATCH (n)
WHERE NOT EXISTS((n)-[:FOLLOWS]->()) 
RETURN n.name

none()関数

none()は、セット内のどの要素も指定された条件を満たさないことを保証します。このクエリは、「Peter」と「Abu」の間のパスで、「Eric」という名前のノードを通過しないパスを見つけます。

MATCH p =(a)-[*1..3]->(b)
WHERE a.name = 'Peter' AND b.name = 'Abu' AND none(x IN nodes(p) WHERE x.name ="Eric") 
RETURN p

single()関数

single()は、セット内の正確に1つの要素が条件を満たすことをチェックします。「Jane」から「Yin Lee」までの3ホップのパスで、「Rita」を1回だけ通過するパスを見つけるには、次のようにします。

MATCH p =(a)-[*3]->(b) 
WHERE a.name = 'Jane' AND b.name = 'Yin Lee' AND single(x IN nodes(p) WHERE x.name ="Rita")
RETURN p

要約すると、Neo4jの述語関数は、Cypherでパターンマッチをデクラレイティブにフィルタリングする強力な方法を提供します。これらをWHERE句およびパス要素を表す変数と組み合わせることで、グラフデータに対する複雑な条件を表現し、インサイトを見つけたり質問に答えたりすることができます。all()、any()、exists()、none()、single()の各関数は、関心のあるサブグラフやパスを絞り込むための論理的なニッチを埋めています。

「超本当にドラゴン」へ

この記事が気に入ったらサポートをしてみませんか?