JavaによるNeo4Jの手引き

1前書き

この記事はhttps://neo4j.com/[ Neo4j ]についての記事です - 今日市場で最も成熟したフル機能のグラフデータベースの1つです。グラフデータベースは、人生の多くのものが ノード (V)の集合として表現され、それらの間の接続が__エッジ(E)と呼ばれることに役立つという観点から、データモデリングのタスクに取り組みます。

2組み込みNeo4j

Neo4j を使い始める最も簡単な方法は、 Neo4j がアプリケーションと同じJVMで動作する組み込みバージョンを使用することです。

まず、Mavenの依存関係を追加する必要があります。

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j</artifactId>
    <version>3.4.6</version>
</dependency>

このリンク をチェックして最新バージョンをダウンロードできます。

次に、ファクトリを作成しましょう。

GraphDatabaseFactory graphDbFactory = new GraphDatabaseFactory();

最後に、埋め込みデータベースを作成します。

GraphDatabaseService graphDb = graphDbFactory.newEmbeddedDatabase(
  new File("data/cars"));

今すぐ本当の行動を始めることができます!最初に、グラフ内にノードをいくつか作成する必要があります。トランザクションが開始されていない限り Neo4j は破壊的な操作を拒否するため、トランザクションを開始する必要があります。

graphDb.beginTx();

トランザクションが進行したら、ノードを追加し始めることができます。

Node car = graphDb.createNode(Label.label("Car"));
car.setProperty("make", "tesla");
car.setProperty("model", "model3");

Node owner = graphDb.createNode(Label.label("Person"));
owner.setProperty("firstName", "baeldung");
owner.setProperty("lastName", "baeldung");

ここで、プロパティ make model を持つノード Car とプロパティ firstName lastName を持つノード Person を追加しました

これで関係を追加できます。

owner.createRelationshipTo(car, RelationshipType.withName("owner"));

上記のステートメントは owner ラベルで2つのノードを結ぶ辺を追加しました。この関係は、Neo4jの強力な Cypher 言語で書かれたクエリを実行することで確認できます。

Result result = graphDb.execute(
  "MATCH (c:Car) <-[owner]- (p:Person) " +
  "WHERE c.make = 'tesla'" +
  "RETURN p.firstName, p.lastName");

ここでは、makeがteslaであるすべての車の車の所有者を見つけ、彼/彼女のfirstNameとlastNameを返すように依頼します。当然のことながら、これは戻ります。

\ {p.firstName = baeldung、p.lastName = baeldung}

3暗号クエリ言語

Neo4j は、データベースに期待されるすべての機能をサポートする、非常に強力で直感的なクエリー言語を提供します。標準の作成、取得、更新、削除のタスクをどのように達成できるかを調べてみましょう。

3.1. ノードを作成

createキーワードは、ノードと関係の両方を作成するために使用できます。

CREATE (self:Company {name:"Baeldung"})
RETURN self

ここでは、単一のプロパティ name を持つ会社を作成しました。ノード定義は括弧でマークされ、そのプロパティは中括弧で囲まれています。この場合、 self はノードのエイリアス、 Company はノードラベルです。

3.2. 関係を作成する

単一のクエリで、ノードとそのノードへの関係をすべて作成することができます。

Result result = graphDb.execute(
  "CREATE (baeldung:Company {name:\"Baeldung\"}) " +
  "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" +
  "RETURN baeldung, tesla");

ここで、ノード baeldung tesla を作成し、それらの間に所有関係を確立しました。既存のノードとの関係を作成することももちろん可能です。

3.3. データを取得する

MATCH キーワードは、どのデータポイントが返されるかを制御するために RETURN と組み合わせてデータを検索するために使用されます。 WHERE 句を使用して、目的のプロパティを持つノードのみを除外できます。

tesla modelXを所有している会社の名前を考えてみましょう。

Result result = graphDb.execute(
  "MATCH (company:Company)-[:owns]-> (car:Car)" +
  "WHERE car.make='tesla' and car.model='modelX'" +
  "RETURN company.name");

3.4. ノードを更新する

SET キーワードは、ノードのプロパティまたはラベルを更新するために使用できます。テスラに走行距離を追加しましょう。

Result result = graphDb.execute("MATCH (car:Car)" +
  "WHERE car.make='tesla'" +
  " SET car.milage=120" +
  " SET car :Car:Electro" +
  " SET car.model=NULL" +
  " RETURN car");

ここでは milage という新しいプロパティを追加し、 Car Electro の両方になるようにラベルを変更して、最後に model プロパティをすべて削除します。

3.5. ノードを削除

DELETEキーワードは、グラフからノードまたは関係を永久に削除するために使用できます。

graphDb.execute("MATCH (company:Company)" +
  " WHERE company.name='Baeldung'" +
  " DELETE company");

ここでは、Baeldungという会社を削除しました。

3.6. パラメータ結合

上記の例では、ベストプラクティスではないハードコードされたパラメータ値があります。幸いなことに、 Neo4j は変数をクエリにバインドする機能を提供します。

Map<String, Object> params = new HashMap<>();
params.put("name", "baeldung");
params.put("make", "tesla");
params.put("model", "modelS");

Result result = graphDb.execute("CREATE (baeldung:Company {name:$name}) " +
  "-[:owns]-> (tesla:Car {make: $make, model: $model})" +
  "RETURN baeldung, tesla", params);

4 Javaドライバ

これまでのところ埋め込み Neo4j インスタンスとのやり取りを検討してきましたが、実運用のためには、スタンドアロンサーバーを実行し、提供されたドライバーを介してそれに接続することを望みます。まず、私たちのmaven pom.xml に別の依存関係を追加する必要があります。

<dependency>
    <groupId>org.neo4j.driver</groupId>
    <artifactId>neo4j-java-driver</artifactId>
    <version>1.6.2</version>
</dependency>

このドライバの最新版をチェックするにはhttps://search.maven.org/search?q=a:neo4j-java-driver[このリンク]をたどることができます。

これで接続を確立できます。

Driver driver = GraphDatabase.driver(
  "bolt://localhost:7687", AuthTokens.basic("neo4j", "12345"));

その後、セッションを作成します。

Session session = driver.session();

最後に、いくつかのクエリを実行できます。

session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " +
  "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" +
  "RETURN baeldung, tesla");

すべての作業を終えたら、セッションとドライバの両方を閉じる必要があります。

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

5 JDBCドライバ

JDBCドライバを介して Neo4j と対話することも可能です。 pom.xml に対するさらに別の依存関係:

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-jdbc-driver</artifactId>
    <version>3.4.0</version>
</dependency>

このドライバの最新版をダウンロードするにはhttps://search.maven.org/search?q=a:neo4j-jdbc-driver[このリンク]をたどることができます。

次に、JDBC接続を確立しましょう。

Connection con = DriverManager.getConnection(
  "jdbc:neo4j:bolt://localhost/?user=neo4j,password=12345,scheme=basic");

ここで con は通常のJDBC接続で、ステートメントまたはプリペアドステートメントの作成と実行に使用できます。

try (Statement stmt = con.
  stmt.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) "
  + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})"
  + "RETURN baeldung, tesla")

    ResultSet rs = stmt.executeQuery(
      "MATCH (company:Company)-[:owns]-> (car:Car)" +
      "WHERE car.make='tesla' and car.model='modelX'" +
      "RETURN company.name");

    while (rs.next()) {
        rs.getString("company.name");
    }
}

6. オブジェクトグラフマッピング

Object-Graph-MappingまたはOGMは、ドメインPOJOを Neo4j データベースのエンティティとして使用できるようにする手法です。これがどのように機能するのかを調べてみましょう。最初のステップでは、通常どおり__pom.xmlに新しい依存関係を追加します。

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-core</artifactId>
    <version>3.1.2</version>
</dependency>

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-embedded-driver</artifactId>
    <version>3.1.2</version>
</dependency>

OGM Core Link およびhttps://search.maven.org/classic/を確認することができます。 #artifactdetails%7Corg.neo4j%7Cneo4j-ogm-embedded-driver%7C2.1.1%7Cjar[OGM Embeddedドライバリンク]これらのライブラリの最新バージョンを確認します。

次に、POJOにOGMアノテーションを付けます。

@NodeEntity
public class Company {
    private Long id;

    private String name;

    @Relationship(type="owns")
    private Car car;
}

@NodeEntity
public class Car {
    private Long id;

    private String make;

    @Relationship(direction = "INCOMING")
    private Company company;
}

@ NodeEntity は、このオブジェクトが結果として得られるグラフのノードによって表される必要があることを Neo4j に通知します。 @ Relationship は、関連タイプを表すノードとの関係を作成する必要性を伝えます。この場合、 company car を所有します。

Neo4j では、各エンティティに主キーが必要で、 id というフィールドがデフォルトで選択されています。 @ Id @ GeneratedValue. というアノテーションを付けることで、別の名前の付いたフィールドを使用することもできます。

次に、__Neo4jのOGMをブートストラップするために使用される構成を作成する必要があります。簡単にするために、組み込みのインメモリ専用データベースを使用しましょう。

Configuration conf = new Configuration.Builder().build();

その後、作成した設定と注釈付きのPOJOが存在するパッケージ名で SessionFactory を初期化します。

SessionFactory factory = new SessionFactory(conf, "com.baeldung.graph");

最後に、 Session を作成して使い始めることができます。

Session session = factory.openSession();
Car tesla = new Car("tesla", "modelS");
Company baeldung = new Company("baeldung");

baeldung.setCar(tesla);
session.save(baeldung);

ここで私たちはセッションを開始し、私たちのPOJOを作成し、それらを持続させるようにOGMセッションに依頼しました。 Neo4j OGMランタイムは、オブジェクトを透過的にデータベース内に適切なノードとエッジを作成する Cypher クエリのセットに変換しました。

このプロセスがよく知られているように思われるなら、それはそれが理由です!それがまさにJPAのしくみです。唯一の違いは、オブジェクトがRDBMSに永続化される行に変換されるか、または一連のノードとエッジがグラフデータベースに永続化されるかです。

7. 結論

この記事では、グラフ指向データベースNeo4jのいくつかの基本について説明しました。

いつものように、この記事のコードはすべてhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-neo4j[Githubで入手可能]です。

前の投稿:Apache Commonsコレクションバッグ
次の投稿:Baeldungウィークリーレビュー22