私は、Neo4j でツリー構造のデータ セットを記述することに取り組んでいます。私の現在のモデルでは、ノードは他のノードへのn 個のリンクを持つことができ、それらのノードの子ノードになります。
root
|
\-- A
|
\-- 1
|
\-- 2
- ルートへのリンク
- 1 と 2 は A にリンクします
- ルートは A の親です
- 1 と 2 は A の子です
nodejs を ( node-neo4jで) 使用しているため、データベースの読み取りは Cypher の使用に制限されています。ノードを読み取るには、次のクエリを使用します。
START n=node(1)
-- this is the root node
MATCH (n)<-[linkedby:links*]-x, x-[linksto?:links*1]->()
-- get all nodes that link to the root node and all nodes linking to those nodes, etc, etc and retrieve all nodes those found nodes link to
RETURN n, x, linkedby, LAST(linkedby) AS parent, COLLECT(DISTINCT linksto) AS links
-- the last in the path of linkedby is the direct parent
ORDER BY length(linkedby), parent.rank?
-- ordering so that parents are fetched before their children from the result set
私の問題: ノードと関係の数が増えると、このクエリは非常に遅くなります (>1 秒)。
ノードと関係をモデル化するより良い方法はありますか? 親ノードと子ノードの間に異なる関係が必要ですか? または、何らかの方法でクエリを変更する必要がありますか?
ご指摘ありがとうございます。
1) 現実世界の問題: サービスがプロセス、組織、チームなどにリンクされている一種のビジネス プロセス ツールで、どのサービスがいつ、誰によって必要とされるか、および誰がこのサービスを提供するか、または責任を負うかについての情報を提供します。
たとえば、次のようになります。
サービス S はプロセス P1 と P2 で使用されます。
P1 P2
| |
\---+-- S
サービス S はチーム T によって管理されます。
T
|
\-- S
チーム T は組織 O の一部です。
O
|
\-- T
木:
root
|
|
+-- Processes
| |
| +-- P1
| | |
| | \-- S
| |
| \-- P2
| | |
| | \-- S
|
+-- Organisations
| |
| +-- O
| |
| \-- T
| |
| \-- S
2) console.neo4j.orgの私のデータ:
CREATE
(r {name:'root'}),
(ps {name: 'Processes'})-[:links]->r,
(p1 {name: 'P1'})-[:links]->ps,
(p2 {name: 'P2'})-[:links]->ps,
(s {name: 'Service'})-[:links]->p1,
s-[:links]->p2,
(org {name: 'Organisations' })-[:links]->r,
(t {name: 'Team'})-[:links]->org,
s-[:links]->t