本文へスキップ
BecomeCoder

Neo4jコース · 第8章 実践とエコシステム · レッスン43

アプリから使う ― Python / JavaScript ドライバ

ローカル実施

導入

これまではNeo4j Browserから直接クエリを実行してきましたが、実際のアプリケーション開発では、プログラムからNeo4jに接続してクエリを実行します。ここでは代表的な2つの言語での接続方法を見てみましょう。

説明

Neo4jは、Python・JavaScript・Java・Go など主要なプログラミング言語向けに公式のドライバ(接続用ライブラリ)を提供しています。基本的な流れはどの言語でも共通しています。

flowchart LR
    App["アプリケーション<br/>(Python/JSなど)"] -- "ドライバ経由で接続" --> DB[(Neo4j<br/>データベース)]
    App -- "Cypherクエリ + パラメータ" --> DB
    DB -- "結果" --> App

Pythonの例neo4j パッケージを使用):

from neo4j import GraphDatabase

driver = GraphDatabase.driver("neo4j+s://<your-instance>.databases.neo4j.io", auth=("neo4j", "password"))

with driver.session() as session:
    result = session.run(
        "MATCH (p:Person {name: $name}) RETURN p.born AS born",
        name="Alice"
    )
    for record in result:
        print(record["born"])

driver.close()

JavaScriptの例neo4j-driver パッケージを使用):

const neo4j = require('neo4j-driver');

const driver = neo4j.driver(
  'neo4j+s://<your-instance>.databases.neo4j.io',
  neo4j.auth.basic('neo4j', 'password')
);

const session = driver.session();
const result = await session.run(
  'MATCH (p:Person {name: $name}) RETURN p.born AS born',
  { name: 'Alice' }
);
result.records.forEach((record) => console.log(record.get('born')));

await session.close();
await driver.close();

どちらの例でも共通しているのが、$name というパラメータを使い、実際の値('Alice')はクエリ文字列に直接埋め込まず、別途渡している点です。もし "MATCH (p:Person {name: '" + name + "'}) RETURN ..." のように文字列を直接連結してクエリを組み立ててしまうと、悪意のある入力によってクエリの意味を書き換えられてしまう インジェクション攻撃 の危険があります。パラメータ化されたクエリを使うことで、この危険を防げます。これはSQLにおけるプレースホルダ(プリペアドステートメント)と全く同じ考え方です。

実務でNeo4jを使ったアプリケーションを作る際は、必ずこのパラメータ渡しの方式でクエリを組み立てるようにしましょう。