導入
これまでは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を使ったアプリケーションを作る際は、必ずこのパラメータ渡しの方式でクエリを組み立てるようにしましょう。