2016-03-31 15 views
1

Neo4j sorgusunda bir sorun yaşıyorum. Uygulama adlı bir Düğüm türüm olduğunu varsayalım. Uygulama düğümleri "m_id" ve "info" alanlarına sahiptir. "Bilgi" alanının eşit olduğu düğümler arasında bir ilişki oluşturmak için bir sorgu oluşturmak istiyorum. Neo4j sorgusunda CYPHER 2.3'ün performansı

Bu

sorgusu:

MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id; 

Ben de iki alana ilişkin endeksler var:

CREATE CONSTRAINT ON (a:App) ASSERT a.m_id IS UNIQUE; 
CREATE INDEX ON :App(info); 

Ama şey App tüm kayıtlarda erişimi olan, çok yavaş sorguları olsun düğümler.

+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| Operator  | Rows | DB Hits | Identifiers  | Other                               | 
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +ColumnFilter |  0 |  0 | b.m_id   | keep columns b.m_id                           | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +Extract  |  0 |  0 | a, b, b.m_id, r | b.m_id                               | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +Merge(Into) |  0 |  1 | a, b, r   | (a)-[r:INFO]->(b)                            | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +Eager  |  0 |  0 | a, b   |                                | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +Filter  |  0 | 2000000 | a, b   | Ands(b.info == a.info, NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[104]:INFO]->(a), true)))) | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +SchemaIndex | 184492 | 1000000 | a, b   | { AUTOSTRING0}; :App(m_id)                         | 
| |    +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 
| +NodeByLabel | 184492 | 1000001 | b    | :App                               | 
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ 

cevap

1

olduğu gibi b için ayrı MATCH maddesi tarafından kullanılan geçici bir değişken içine a.info koymak için bir WITH cümleciği kullanarak tek başına a bulma deneyin:

Bu

sorgunun profilidir: 2 düğümlerin özellikleri karşılaştırılırken endekslerin kullanılmadığı görülmektedir. a_info kullanımı bu engeli kaldırır.

yukarıda profili bir veya her iki endeksleri kullanılmadığından emin gösteriyorsa, dizin ipuçlarını eklemeyi deneyebilirsiniz:

MATCH (: Ben İSTEĞE MAÇ kullanarak bir çözüm anlamaya

MATCH (a:App { m_id:'SOME_VALUE' }) 
USING INDEX a:App(m_id) 
WITH a, a.info AS a_info 
MATCH (b:App { info: a_info }) 
USING INDEX b:App(info) 
WHERE a <> b AND NOT (b)-[:INFO]->(a) 
MERGE (a)-[r:INFO]->(b) 
RETURN b.m_id; 
+0

İki maçta halinde bölmeli için yeterince iyi:

Bu

sorgunun profilidir. 2.3 –

+0

içinde ara bağlantı veya ifade takma adlarına gerek yoktur. Çözümünüz de çalışır. –

0

a: Uygulama {m_id: 'SOME_VALUE'}) OPSİYONEL MATCH (a), (b: App {info: a.info}) NEREDE (a) <> ID (b) VE NOT (b) - [: INFO] -> (a) MERGE (a) - [r: BİLGİ] -> (b) RETURN b.m_id;

+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| Operator  | Rows | DB Hits | Identifiers  | Other                          | 
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +ColumnFilter | 0 |  0 | b.m_id   | keep columns b.m_id                      | 
| |    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +Extract  | 0 |  0 | a, b, b.m_id, r | b.m_id                          | 
| |    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +Merge(Into) | 0 |  1 | a, b, r   | (a)-[r:INFO]->(b)                       | 
| |    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +Eager   | 0 |  0 | a, b   |                           | 
| |    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +OptionalMatch | 0 |  0 | a, b   |                           | 
| |\    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| | +Filter  | 0 |  0 | a, b   | Ands(NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[109]:INFO]->(a), true)))) | 
| | |   +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| | +SchemaIndex | 0 |  0 | a, b   | a.info; :App(info)                      | 
| | |   +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| | +Argument | 0 |  0 | a    |                           | 
| |    +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
| +SchemaIndex | 0 |  1 | a    | { AUTOSTRING0}; :App(m_id)                    | 
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+