0

私は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 のドキュメントを読みましたが、理解できません。ありがとう!

4

0 に答える 0