ノード/リレーションシップにカスタム ID を使用する
Neptune では、ノードと関係に明示的に ID を割り当てることができます。ID が有用であるためには、データセット内でグローバルに一意であり、決定論的である必要があります。プロパティと同様、決定論的な ID はルックアップまたはフィルタリングメカニズムとして使用できます。ただし、クエリ実行の観点から見れば、プロパティを使用するよりも ID を使用することが最適と言えます。カスタム ID の使用にはいくつかの利点があります。
-
既存のエンティティのプロパティは null にできますが、ID が存在する必要があります。これにより、クエリエンジンは実行時に最適化された結合を使用できます。
-
同時ミューテーションクエリを実行する場合、ID を使用してノードにアクセスすると、同時変更例外 (CMEs) の可能性が大幅に低下します。これは、一意性が強制されるため、プロパティよりも ID に対するロックがより少ないためです。
-
ID を使用すると、プロパティとは異なり、Neptune が ID の一意性を強制するため、重複データが作成される可能性を回避できます。
次のクエリ例では、カスタム ID を使用しています。
注記
プロパティ ~id は ID を指定するために使用されますが、id は単に他のプロパティとして保存されます。
CREATE (n:Person {`~id`: '1', name: 'alice'})
カスタム ID を使用しない場合:
CREATE (n:Person {id: '1', name: 'alice'})
後者のメカニズムを使用する場合、一意性の強制はなく、後でクエリを実行できます。
CREATE (n:Person {id: '1', name: 'john'})
これにより、john という名前の 2 番目のノード id=1 が作成されます。このシナリオでは、id=1 を持つノードが 2 つあり、それぞれに異なる名前 (alice と john) が付けられています。