私はNeo4jデスクトップv1.4.1を実行しています。データベースは4.2.1エンタープライズです。
プレースメント、キャンペーン、プレースメントからキャンペーンへの「含む」関係の単純なグラフがあります。これは新しいデータセットで、すべてのノードが一意です。一部のプレースメントには数千のキャンペーンが「含まれている」ため、返されたキャンペーンをキャンペーン ID の包含リストでフィルタリングしたいと考えています。
一致したすべてのノードを返すと、次のように機能します。
neo4j@neo4j> MATCH (:Placement {id: 5})-[:CONTAINS]->(c:Campaign)
WHERE c.id IN [400,263,150470,25810,37578]
RETURN *;
+--------------------------+
| c |
+--------------------------+
| (:Campaign {id: 37578}) |
| (:Campaign {id: 263}) |
| (:Campaign {id: 25810}) |
| (:Campaign {id: 150470}) |
+--------------------------+
キャンペーン ID だけをリクエストすると、重複が発生します。
neo4j@neo4j> MATCH (:Placement {id: 5})-[:CONTAINS]->(c:Campaign)
WHERE c.id IN [400,263,150470,25810,37578]
RETURN c.id;
+--------+
| c.id |
+--------+
| 150470 |
| 150470 |
| 150470 |
| 150470 |
+--------+
プレースメント 5 とキャンペーン 15070 の間には CONTAINS 関係が 1 つだけあります。
neo4j@neo4j> MATCH (:Placement {id: 5})-[rel:CONTAINS]->(:Campaign {id:150470})
RETURN count(rel);
+------------+
| count(rel) |
+------------+
| 1 |
+------------+
EXPLAIN は次のクエリ プランを返しますcache[c.id]
。
+---------------------------+------------------------------------------------------------------------------------------------------+----------------+---------------------+
| Operator | Details | Estimated Rows | Other |
+---------------------------+------------------------------------------------------------------------------------------------------+----------------+---------------------+
| +ProduceResults@neo4j | `c.id` | 4 | Fused in Pipeline 1 |
| | +------------------------------------------------------------------------------------------------------+----------------+---------------------+
| +Projection@neo4j | cache[c.id] AS `c.id` | 4 | Fused in Pipeline 1 |
| | +------------------------------------------------------------------------------------------------------+----------------+---------------------+
| +Expand(Into)@neo4j | (anon_7)-[anon_27:CONTAINS]->(c) | 4 | Fused in Pipeline 1 |
| | +------------------------------------------------------------------------------------------------------+----------------+---------------------+
| +MultiNodeIndexSeek@neo4j | UNIQUE anon_7:Placement(id) WHERE id = $autoint_0, cache[c.id], UNIQUE c:Campaign(id) WHERE id IN $a | 25 | In Pipeline 0 |
| | utolist_1, cache[c.id] | | |
+---------------------------+------------------------------------------------------------------------------------------------------+----------------+---------------------+
編集:クエリの先頭に追加するとCYPHER runtime=SLOTTED
、期待される出力が得られます:
+--------+
| c.id |
+--------+
| 37578 |
| 263 |
| 25810 |
| 150470 |
+--------+
WHERE 句を省略すると、一意のキャンペーン ID が取得されます (ただし、多すぎます)。明らかな何かが欠けているように感じますが、neo4j のドキュメントを読みましたが、理解できません。ありがとう!