[アップデート] Amazon NeptuneがopenCypherクエリ言語をサポートしました!

Amazon Neptune が openCypher クエリ言語をサポートしたため、openCypher で簡単なグラフを作成してみました
2021.08.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Neptune が openCypher に対応したため、試してみました!

これまで Neptune はクエリ言語として Apache TinkerPop Gremlin と W3C SPARQL をサポートしていましたが、新しく openCypher のサポートが追加されました。

openCypher とは、グラフデータベースの Neo4j で利用されているクエリ言語であり、2015 年にオープンソースとして公開されました。SQL に着想を得た言語となります。

ただし、OpenCypher はまだ実験的サポートのため、本番環境では使用しないようにしてください。

検証環境

Neptune はインターネットに直接公開できないため、EC2 インスタンス (Amazon Linux 2) から openCypher クエリを発行する構成で検証を行います。

検証環境の構成図です。

openCypher を利用するためには Neptune のエンジンバージョンは「1.0.5.0」以降である必要があります。

検証環境の Neptune の設定です。

なお、エンジンバージョン 1.0.5.0 (2021-07-27)ではデフォルトで openCypher が有効になっているため、パラメータグループはデフォルトを利用しています。

openCypher クエリのお試し

Neptune への openCypher クエリは、HTTPS エンドポイントに対して行います。

まずは status endpoint を確認してみます。実行中のクエリを確認できることが分かります。

$ curl https://test-neptune.cluster-czua0z3kg15z.ap-northeast-1.neptune.amazonaws.com:8182/openCypher/status
{
    "acceptedQueryCount" : 0,
    "runningQueryCount" : 0,
    "queries" : [ ]
}

HTTPS エンドポイントに対しては、GET と POST メソッドを利用した更新と読み取りができ、DELETE と PUT メソッドはサポートされていません。

例えば、「MATCH (n) RETURN n」を実行する場合の実行例は下記となります。

  • GET の場合
curl HTTPS://server:port/openCypher -d "query=MATCH (n) RETURN n;"
  • POST の場合(URL エンコードが必要)
curl -X GET "HTTPS://server:port/openCypher?query=MATCH%20(n)%20RETURN%20n"

ここからは Neptune にグラフデータを投入していきます。Company (Classmethod) とPerson (Staff-a, Staff-b) の雇用関係を構築してみます。

  • グラフの図

  • openCypher クエリ
CREATE (c1:Company { name: 'Classmethod' }),
       (p1:Person { name: 'Staff-a' }),
       (p2:Person { name: 'Staff-b' }),
       (c1)-[:EMPLOY]->(p1),
       (c1)-[:EMPLOY]->(p2)

グラフデータを Neptune に投入します。

$ curl HTTPS://test-neptune.cluster-czua0z3kg15z.ap-northeast-1.neptune.amazonaws.com:8182/openCypher -d "query=CREATE (c1:Company { name: 'Classmethod' }), (p1:Person { name: 'Staff-a' }), (p2:Person { name: 'Staff-b' }), (c1)-[:EMPLOY]->(p1), (c1)-[:EMPLOY]->(p2);"
{
  "results" : [ ]
}

作成したグラフから EMPLOY 関係をすべて表示します。

$ curl HTTPS://test-neptune.cluster-czua0z3kg15z.ap-northeast-1.neptune.amazonaws.com:8182/openCypher -d "query=MATCH (company)-[employ:EMPLOY]->(person) RETURN company, employ, person;"
{
  "results" : [ {
    "company" : {
      "~id" : "40286c4b-ab29-4a59-aa40-7b24bcfe7ff7",
      "~entityType" : "node",
      "~labels" : [ "Company" ],
      "~properties" : {
        "name" : "Classmethod"
      }
    },
    "employ" : {
      "~id" : "9a4a6274-9818-47d6-b194-c7b28708eb31",
      "~entityType" : "relationship",
      "~start" : "40286c4b-ab29-4a59-aa40-7b24bcfe7ff7",
      "~end" : "eb6d840e-b178-4f6e-846c-c5dd1c2bbb4a",
      "~type" : "EMPLOY"
    },
    "person" : {
      "~id" : "eb6d840e-b178-4f6e-846c-c5dd1c2bbb4a",
      "~entityType" : "node",
      "~labels" : [ "Person" ],
      "~properties" : {
        "name" : "Staff-a"
      }
    }
  }, {
    "company" : {
      "~id" : "40286c4b-ab29-4a59-aa40-7b24bcfe7ff7",
      "~entityType" : "node",
      "~labels" : [ "Company" ],
      "~properties" : {
        "name" : "Classmethod"
      }
    },
    "employ" : {
      "~id" : "42ade5cc-a1cc-4b66-b710-4dc4b57be67a",
      "~entityType" : "relationship",
      "~start" : "40286c4b-ab29-4a59-aa40-7b24bcfe7ff7",
      "~end" : "64f80fdb-744f-4847-9a7f-ee1567212ffb",
      "~type" : "EMPLOY"
    },
    "person" : {
      "~id" : "64f80fdb-744f-4847-9a7f-ee1567212ffb",
      "~entityType" : "node",
      "~labels" : [ "Person" ],
      "~properties" : {
        "name" : "Staff-b"
      }
    }
  } ]
}

openCypher クエリを用いて Neptune にグラフデータベースを構築できることが確認できました。

最後にグラフデータの削除を行います。

$ curl HTTPS://test-neptune.cluster-czua0z3kg15z.ap-northeast-1.neptune.amazonaws.com:8182/openCypher -d "query=MATCH (n) DETACH DELETE n;"

まとめ

Amazon Neptune が openCypher クエリ言語をサポートしたため、openCypher で簡単なグラフを作成してみました。今後は、これまで Neo4j を利用していたユーザが Neptune を利用しやすくなるのではないでしょうか。

参考

Accessing the Neptune Graph with openCypher - Amazon Neptune

openCypher · openCypher