2015-08-13 2 views
1

Это довольно простой, но я не знаю, почему его происходит:Отношения создания дополнительных узлов

CREATE (JFK: Аэропорт) СОЗДАТЬ (MIA: Аэропорт)

CREATE (JFK) - [: ROUTE] -> (MIA)

Вместо создания отношений между JFK и MIA он фактически создает еще два узла. Я думал, что он будет использовать идентификатор узла (JFK) и использовать этот экземпляр.

+0

Кроме того, есть это все одно утверждение Cypher или несколько? –

+0

Хороший вопрос. Если они были выполнены вместе, я уверен, что он будет использовать идентификаторы и создавать только два узла, добавить 2 метки и создать 1 связь. EDIT: просто протестирован, и это именно так. – ceej

ответ

0

Это интересно. Что делать, если вы сделали следующее (изменение переменных на нижний регистр, что является наиболее распространенной практикой)?

CREATE (jfk:Airport), (mia:Airport), (jfk)-[:ROUTE]->(mia) 
0

Брайан Андервуд задал вопрос, который стимулировал мой ответ. Вы выполняете инструкции по строкам. Это создает 4 узла, 2 метки и 1 отношение. Neo4j не знает, что JFK или MIA относятся к заключительному оператору создания.

Подробно:

CREATE (JFK:Airport) 

Это создает узел с меткой Airport и без каких-либо свойств. JFK - это идентификатор, используемый только в этом контексте исполнения.

CREATE (MIA:Airport) 

Это создает еще один узел с меткой Airport и без каких-либо свойств. MIA - это идентификатор, используемый только в этом контексте исполнения.

CREATE (JFK)-[:ROUTE]->(MIA) 

Это создает два дополнительных узлов с не этикеток, а также создает связь между ними.

Если вы выполните их все вместе, Neo4j будет использовать идентификаторыи MIA и создать только 2 узла и 1 связь.

CREATE (JFK:Airport) 
CREATE (MIA:Airport) 
CREATE (JFK)-[:ROUTE]->(MIA) 

Это делает то, что, как я думаю, вы ожидаете.

0

Поскольку вы использовали два отдельных запроса, идентификаторы, используемые в первом запросе, полностью неизвестны во втором запросе.

Идентификаторы (для узлов и отношений) являются временными и имеют смысл только в одном запросе Cypher - они никогда не сохраняются в БД.

Фактически, для полноты вы должны знать, что идентификатор может даже не иметь смысла в одном запросе, если этот запрос содержит WITH statements. Например, в следующем запросе, вы будете в конечном итоге с 3-мя узлами (2 Airport узлов и 1 дополнительный узел без метки), потому что WITH заявление не прошло b идентификатор вперед:

CREATE (a:Airport {code:"JFK"}), (b:Airport {code:"MIA"}) 
WITH a 
CREATE (a)-[:ROUTE]->(b);