1

私はeveryman neo4jクライアントを調べています( https://github.com/jadell/neo4jphp/wiki )

それは非常に有望で快適に使用できます。しかし、私はインデックスについて少し混乱しています。Neo4j では、インデックスを追加できることを知っています。

CREATE INDEX ON :Person(name)

私の記憶が正しければ、これによりすべての Person ノードが名前で自動的にインデックス付けされます。

everyman クライアント ライブラリのインデックスに関するセクションでは、次のようにインデックスを作成してノードに追加できることが示されています。

$shipIndex = new Everyman\Neo4j\Index\NodeIndex($client, 'ships');

(PS: 上記の行は正確には何をしますか?)

$heartOfGold = $client->makeNode()
    ->setProperty('propulsion', 'infinite improbability drive')
    ->save();

// Index the ship on one of its properties
$shipIndex->add($heartOfGold, 'propulsion', $heartOfGold->getProperty('propulsion'));

さて、私の質問です。上記の例のように PHP コードにインデックスを手動で追加する必要があるのはいつですか? また、Neo4j データベースにインデックスを追加して自動インデックス作成に依存する必要があるのはいつですか? 後者の場合、次のようなコードでインデックス検索を利用できますか。

$match = $shipIndex->findOne('captain', 'Zaphod');

?

4

1 に答える 1

1

上記の最初のメソッドは、ノードとその推進プロパティを lucene インデックスに追加します。この種のインデックスは、数年前からレガシーとしてマークされているわけではありません。

スキーマ インデックスは次のように機能します。

ラベル/プロパティの組み合わせでインデックスを作成します。たとえば、ログイン プロパティでユーザーを検索する必要があることがわかっている場合は、通常、検索を高速化するためにインデックスを追加することをお勧めします。

CREATE INDEX ON :User(login);

この種のインデックスは、neo4j 3.0 もCONTAINS句とともに使用できるため、たとえば、ログインにneo文字が含まれるすべてのユーザーを取得します。

MATCH (n:User) WHERE n.login CONTAINS 'neo' RETURN n

上記で作成したインデックスを使用して高速に取得します。(注意: 現在、CONTAINS は大文字と小文字が区別されます)

レガシー インデックスとスキーマ インデックスの完全な違いの説明については、ここでよく説明されています: Neo4j 自動インデックス、レガシー インデックスとラベル スキーマ: ノードに対する相対全文検索の違い

残念ながら、コミット履歴からわかるように、あなたが言及したライブラリはもう維持されていませんhttps://github.com/jadell/neo4jphp/commits/master

Neo4j は大きく進化しており、特に 3.0 バージョンでは、http と比較してパフォーマンスが向上し、待ち時間が短縮された新しいバイナリ プロトコルが利用可能になりました。

https://github.com/graphaware/neo4j-php-clientのような最新のクライアントを使用することをお勧めします (免責事項: 私は次のライブラリの作成者です) 。(これは純粋なドライバーであることに注意してください。これは ogm 機能を提供しません。たとえば、独自の Cypher クエリを作成する必要があります)。

于 2016-05-21T13:57:12.620 に答える