1

グラフデータベース「neo4j」にカテゴリ構造を作成しました。私にはノードと関係があり、すべてが完璧です。

PHP用のNeoxygen Neoclientを使用してデータにアクセスしています。ルート要素からカテゴリグラフ全体 (構造を含む) を効率的にクエリするにはどうすればよいですか?

MATCH (a:`Category`{category_id:0})-[r:HAS_CHILD*]->(b:`Category`)
RETURN b,r

PHP での私の望ましい構造は次のとおりです。 - ルート --- カテゴリ A -------- サブカテゴリ AB --- カテゴリ B --- カテゴリ C -------- サブカテゴリ CA ------ ---------- サブサブカテゴリー CAA ...

何か案は?

前もって感謝します。

mr_g

4

3 に答える 3

3

Neoxygen の NeoClient では、完全に実現可能でユーザー フレンドリーです。

最初に確認することは、応答フォーマッターを有効にすることです。

$client = ClientBuilder::create()
   ->setAutoFormatResponse(true)
   ->addConnection(xxx...)
   ->build();

次に、クエリに関して、グラフの接続性に応じてメモリの動作を回避するために、深さの制限を確実に設定します。

MATCH (a:`Category`{category_id:0})-[r:HAS_CHILD*..20]->(b:`Category`)
RETURN b,r

次に、クライアントでそれを送信すると、クライアントが結果をグラフ構造に再マッピングするという利点があります。

$query = 'MATCH (a:`Category`{category_id:{id}})-[r:HAS_CHILD*..20]->(b:`Category`)'
RETURN b,r';
$children = $client->sendCypherQuery($q, ['id'=>0])->getResult()->getNodes();

これで、関係と関係が開始ノードと終了ノードを知っているので、各ノードは彼が持っているものを知っています。例:

$children最初の深さのノードなので、

$rels = $children->getOutboundRelationships();
$nodes = [];
foreach ($rels as $rel) {
  $nodes[] = $rel->getEndNode();
}

$nodes は深さ 2 のすべてのノードを保持するようになりました。

現在、最初に関係を取得せずにノード オブジェクトから接続されたノードを直接取得する方法はありません。クライアントに追加できるものかもしれません。

于 2015-06-03T21:32:31.093 に答える
2

Cypher は表形式のデータを返すため、ツリー階層を取得する場合、最も効率的な方法は、ルートからリーフまでのすべてのパスを返すことです。パスは node-(relationship-node)* のコレクション/配列です (つまり、オブジェクトの数が奇数であり、常にノードと関係が交互に両端にノードを含んでいます)。これを行う方法の暗号は次のとおりです。

MATCH path(a:`Category`{category_id:0})-[r:HAS_CHILD*]->(b:`Category`)
WHERE NOT(b-[:HAS_CHILD]->())
RETURN b,r

このWHERE句により、リーフへのすべてのパスのみが返されることが保証されます。部分パスも提供するツリー内のすべてのカテゴリを返すこともできますが、これらの部分パスはすべて長いパスに含まれているため、必要以上のデータを返すことになります。

パスを取得したら (私は PHP の専門家ではないので、Neoclient にどのような形式で表示されるかはわかりません)、結果からメモリ内に階層的なデータ構造を構築できます。私の記憶が正しければ、PHP の map/dictionary-type 構造は連想配列です。

于 2015-06-03T21:25:39.110 に答える
0

スキーマ:

Indexes
  ON :Category(category_id)   ONLINE (for uniqueness constraint) 

Constraints
  ON (category:Category) ASSERT category.category_id IS UNIQUE

クエリ:

MATCH(c:Category) RETURN c
于 2015-06-07T10:17:14.353 に答える