2015-04-26 6 views
2

У меня есть уникальный объект (: Neighborhood), который уникально появляется [: IN] a (: City). Я хотел бы создать новый соседний узел и установить его отношение ТОЛЬКО, если этот соседний узел не существует в этом городе. Могут быть несколько районов, имеющих одно и то же имя, но каждый район должен отображаться однозначно в собственном городе.Создайте команду NOT MATCH для CQL Neo4j?

После консультации с ответом Гила здесь: Return node if relationship is not present, как я могу сделать что-то вроде:

MATCH a WHERE NOT (a:Neighborhood {name : line.Neighborhood})-[r:IN]->(c:City {name : line.City}) 
ON MATCH SET (a)-[r]-(c) 

Так тогда было бы только создать новый узел окрестности, если он уже не существует в городе.

** UPDATE: ** Я модернизировал и профилированного его и до сих пор не может воспользоваться любой оптимизаций ...

PROFILE LOAD CSV WITH HEADERS FROM "file://THEFILE" as line 
WITH line LIMIT 0 
MATCH (c:City { name : line.City}) 
MERGE (n:Neighborhood {name : toInt(line.Neighborhood)})-[:IN]->(c) 

; 


+--------------+------+--------+---------------------------+------------------------------+ 
|  Operator | Rows | DbHits |    Identifiers |      Other | 
+--------------+------+--------+---------------------------+------------------------------+ 
| EmptyResult | 0 |  0 |       |        | 
| UpdateGraph | 5 |  16 | anon[340], b, neighborhood, line |     MergePattern | 
| SchemaIndex | 5 |  10 |     b, line | line.City; :City(name) | 
| ColumnFilter | 5 |  0 |      line |   keep columns line | 
|  Filter | 5 |  0 |   anon[216], line |     anon[216] | 
|  Extract | 5 |  0 |   anon[216], line |     anon[216] | 
|  Slice | 5 |  0 |      line |     { AUTOINT0} | 
|  LoadCSV | 5 |  0 |      line |        | 
+--------------+------+--------+---------------------------+------------------------------+ 
+0

Как это выглядит, если вы измените 'LIMIT' на что-то вроде 5? Сколько строк в вашем CSV? –

+0

@BrianUnderwood Вот как это выглядит, когда я делаю это с ограничением 5 – NumenorForLife

+1

Еще один удар: есть ли указатель на 'Neighborhood.name'? –

ответ

2

Я думаю, вы могли бы просто использовать MERGE для этого:

MATCH (c:City {name: line.City}) 
MERGE c<-[:IN]-(a:Neighborhood {name : line.Neighborhood}) 

Если вы еще не импортировали все города, вы можете создать те с MERGE:

MATCH (c:City {name: line.City}) 
MERGE c<-[:IN]-(a:Neighborhood {name : line.Neighborhood}) 

Но берегитесь Eager оператора:

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

Короче говоря: Вы должны запустить ваш LOAD CSV (я предполагаю, что это то, что вы делаете здесь) дважды, один раз загрузить города и один раз загрузить окрестности ,

+0

На стороне примечания: Neo4j 2.2.1 содержит много улучшений, чтобы предотвратить стремление. –

+0

О, отлично, я этого не знал! Благодаря! –

+0

Брайан нет никакой разницы между двумя заявлениями, которые вы написали. Я, к сожалению, очень хочу, когда я это сделаю из-за этого утверждения соответствия. – NumenorForLife

Смежные вопросы