Cypher (問い合わせ言語)

Cypherは宣言型 グラフクエリ言語であり、プロパティグラフにおいて理解しやすい表現で効率的なデータクエリを可能にします。 Cypherの大部分は2011年に Neo4j,Inc (旧、Neo Technology) のアンドレス・テイラー (Andrés Taylor) が考案しました。 CypherはもともとNeo4jグラフデータベースで使用することを目的としていましたが、2015年10月にopenCypherと言うオープンソースプロジェクトとして公開されました。 この言語は、RDBMSの標準クエリ言語であるSQLの能力と機能を念頭に置いて設計されましたが、グラフ理論の概念を持つデータベースの構成と要求に基づいて設計されています。グラフモデルでは、データはノードおよびリレーションシップ（エッジ）で表現され、データのエンティティ間の接続や関連に焦点を当てています。 Cypherは、データをノードとエッジ（Cypherでは「リレーションシップ」と呼ばれます）で表現するプロパティグラフモデルに基づいています。ノードとリレーションシップと言う標準の要素に加え、プロパティグラフモデルではデータのより細かいカテゴリと属性を記述するためにラベルとプロパティを追加しています。 ノードはグラフではエンティティを表します。ノードとリレーションシップはプロパティと呼ばれる属性（キーバリューペア）をいくつでも持つことができます。ノードは、さまざまな分類を表す0個以上のラベル（タグやカテゴリのようなもの）を付けることができます。リレーションシップは、2つのノードの間に意味のある有向の接続関係を作ります。1つのリレーションシップには、常に方向、開始ノード、終了ノード、および1つのリレーションシップの型があります。ノードと同様に、リレーションシップにもプロパティを設定できます。 ノードに0個以上のラベルを割り当てることにより、類似したノードをグループ化できます。ラベルは一種のタグであり、エンティティの特定の型を指定して検索または作成できます。プロパティは、文字列キーとCypherのデータ型の値で関連づけられたキーバリューペアです。 Cypherのクエリは、データを作成、読み取り、更新、削除する記述と検索条件を組み合わせたノードとリレーションシップで構成されています。 Cypherのデータ型は、他のプログラミング言語やクエリ言語で使用される一般的な型の多くが含まれています。サポートされる型は、ブール、文字列、数値、整数、浮動小数点数などのスカラー値の型が含まれます。また、datetime、localdatetime、date、time、localtime、durationなどの時間型もサポートしています。 Cypherクエリ言語は、ノードとリレーションシップのパターンを表し、ラベルとプロパティでそれらのパターンをフィルタリングします。Cypherの構文は、アスキーアートに基づいています。これは、コンピューター用ASCIIコードを使ったテキストベースのビジュアルアートです。これにより、言語はクエリで指定されたデータ構造を視覚的および構造的に表すため、非常に視覚的で読みやすくなっています。 たとえば、ノードは、エンティティに関する属性と情報を囲む丸括弧で表されます。リレーションシップは、リレーションシップタイプを角括弧で囲んだ矢印（有向または無向）で示されます。 //ノード (variable:Label {propertyKey: 'propertyValue'}) //リレーションシップ -[variable:RELATIONSHIP_TYPE]-> //Cypherパターン (node1:LabelA)-[rel1:RELATIONSHIP_TYPE]->(node2:LabelB) 他のクエリ言語と同様に、Cypherにはパターンの指定、パターンのフィルタリング、および結果を返すためのさまざまなキーワードが含まれています。最も一般的なものは、MATCH、WHERE、RETURNです。これらは、SQLのSELECTおよびWHEREとは少し異なる記述になりますが、同じような動作になります。 MATCHは、ノード、リレーションシップ、またはノードとリレーションシップの組み合わせを検索するための検索パターンを記述する時に使用されます。 CypherのWHEREは、パターンに制約を追加したり不要なパターンを除外したりするために使用されます。 CypherのRETURNは、結果の出力をフォーマットしたり並べたりします。他のクエリ言語と同様に、特定のプロパティ、リスト、並べ替えなどを使用して結果を返すことができます。 上記のパターン構文のキーワードを使用して、以下のクエリの例では、ノード（Actorラベルとnameプロパティが「Nicole Kidman」の値を持つ）からリレーションシップ（ACTED_INの矢印）によって別のノード（Movieラベル）に接続されたパターンを検索します。次に、WHERE句は、MATCH句のMovieノードに渡されたパラメーターの値より小さいyearプロパティがあるパターンのみを検索するようにフィルター処理します。戻り値は、パターンに一致するMovieノードを出力するように指定し、MATCH句とWHERE句で選択します。 MATCH (nicole:Actor {name: 'Nicole Kidman'})-[:ACTED_IN]->(movie:Movie) WHERE movie.year < $yearParameter RETURN movie Cypherには、データの書き込み、更新、削除の句を指定するキーワードもあります。CREATEおよびDELETEは、ノードおよびリレーションシップを作成および削除するために使用されます。SETおよびREMOVEは、プロパティに値を設定したりノードにラベルを追加したりするために使用されます。MERGEは、重複することなく一意にノードを作成するために使用されます。ノードは、他とのリレーションシップがまだ存在しない場合にのみ削除できます。Cypherの事例: MATCH (startContent:Content)-[relationship:IS_RELATED_TO]->(endContent:Content) WHERE endContent.source = 'user' OPTIONAL MATCH (endContent)-[r]-() DELETE relationship, endContent openCypherプロジェクトにおいて、Cypherをグラフ処理のクエリ言語として標準化する取り組みが始まりました。この取り組みでは、5回のopenCypher Implementers Meeting (oCIM) が開催されました。最初の会議は2017年2月にドイツのヴァルドルフにあるSAP本社で開催され、Linked Data Benchmark Councilの会議と同時に開催されました。直近のoCIMは2019年3月にベルリンでグラフデータのWeb標準に関するW3Cワークショップと同時開催されました。. その会議では、国際標準化されたGQLと呼ばれるグラフクエリ言語のより大きなプロジェクトに重要なインプットとなるCypherに対して作業を行うという合意がありました。2019年9月、GQL標準プロジェクトの提案は、ISOとIECの第一合同技術委員会（情報技術分野の標準化活動を担当）のメンバーである国家標準化団体の投票により承認されました。GQLプロジェクトの提案では、次のことを述べています: データモデリングの基本的な表現としてグラフを使用することは、データ管理の新しいアプローチです。このアプローチでは、データセットはグラフとしてモデル化され、各データエンティティをグラフの頂点（ノードとも呼ばれます）として表し、2つのエンティティ間の各関係を対応する頂点間のエッジとして表します。グラフデータモデルは、そのユニークな利点で注目されています。まず、グラフモデルは、階層構造、複雑な構造、任意の構造を持つデータセットにも自然に適合することができます。このような構造は、エッジとしてグラフモデルに簡単に変換できます。これは、全てに共通の列を持つテーブルでデータの正規化を必要とするリレーショナルモデルよりも便利です。次に、グラフモデルにより、到達可能性クエリ、最短経路または最安経路クエリ、中心性分析など、データエンティティ間のマルチホップ関係を観察する必要があるような価値があるクエリまたはデータ分析機能を効率的に実行できます。現在使用されているグラフモデルには、リソース記述フレームワーク（RDF）モデルとプロパティグラフモデルの2つがあります。RDFモデルは、多くの仕様でW3Cによって標準化されています。一方、プロパティグラフモデルは、グラフデータベース、グラフアルゴリズム、およびグラフ処理機能など数多く実装されています。しかしながら、プロパティグラフの一般的に標準化されたクエリ言語（リレーショナルデータベースシステムのSQLのようなもの）がありません。GQLはこの空白を埋めるために提案されています。. Neo4j Memgraph SAP HANA RedisGraph AgensGraph AnzoGraph Cypher for Apache Spark Neo4j, Cypherクエリ言語を実装した最も人気のあるグラフデータベース SPARQL, RDF問合せ言語 グレムリン (プログラミング言語), Apache TinkerPopにより開発されたプログラミング言語