2015-12-12 3 views
0

Я создаю слово дерево, но когда я выполняю этот Cypher запрос:Создать узел и отношения данного родительского узла

word = "MATCH {} MERGE {}-[:contains]->(w:WORD {{name:'{}'}}) RETURN w" 
    .format(parent_node, parent_node, locality[i]) 

где parent_node имеет тип Node

Он бросает эту ошибку:

py2neo.cypher.error.statement.InvalidSyntax: Can't create `n8823` with properties or labels here. It already exists in this context 

Отформатированный запрос выглядит следующим образом:

'MATCH (n8823:HEAD {name:"sanjay"}) MERGE (n8823:HEAD {name:"sanjay"})-[:contains]->(w:WORD {name:\'colony\'}) RETURN w' 

ответ

1

Отформатированный запрос сломан и не будет работать, но я также не вижу, как это может выглядеть так, как выглядит форматированный запрос. Когда вы делаете свой строковый формат, вы пропускаете один и тот же параметр (parent_node) дважды, чтобы финальная строка повторяла все параметры. Это не так, и вместо этого есть два разных шаблона для предложений match и merge.

Ваш запрос должен выглядеть как

MATCH (n8823:Head {name: "sanjay"}) 
MERGE (n8823)-[:CONTAINS]->(w:Word {name: "colony"}) 
RETURN w 

Это, вероятно, плохая идея, чтобы сделать строку форматирования на Node объекта. Лучше либо использовать значения свойств из вашего объекта-узла в запросе Cypher для соответствия правильному узлу (и только переменная, с которой вы привязываете согласованный узел в условии слияния) или использовать методы объекта-узла для выполнения слияние.

+0

Как я могу получить это значение n8823? – blackmamba

+0

Это имя переменной, к которой вы привязываете свое соответствие. Я использовал то же имя переменной, что и в вашем запросе, я не знаю, почему вы используете это имя переменной. Я предполагаю, что он исходит из 'parent_node', когда вы используете его в своей строке формата. – jjaderberg

+0

Как извлечь n8823 из объекта узла? – blackmamba

0

Хотя положение MERGE способен связывать идентификаторы (например, n8823), Cypher, к сожалению, не позволяет MERGE к повторно связать идентификатор, который уже связан - даже если он не будет на самом деле изменить связывание. (С другой стороны, статья MATCHделает, что позволяет «перевязать» к одной и той же привязке.) Просто повторное использование связанный идентификатор в порядке.

Итак, обходным путем является изменение запроса Cypher для повторного использования связанного идентификатора. Кроме того, рекомендуемый способ динамического указания данных запроса без изменения общей структуры запроса заключается в использовании «параметров запроса». Для py2neo, код вдоль этих линий должны работать для вас (обратите внимание, что переменная parent_name будет содержать строку имени, как «Санджая»):

from py2neo import Graph 
graph = Graph() 
cypher = graph.cypher 
results = cypher.execute(
    "MATCH (foo:{name:{a}}) MERGE (foo)-[:contains]->(w:WORD {{name:'{b}'}}) RETURN w", 
    a=parent_name, b=locality[i]) 
+0

На самом деле, я не могу этого сделать. Я добавил этот оператор в цикл, поэтому принимает значение по мере повторения цикла. Таким образом, ярлык foo продолжает меняться. – blackmamba

+0

Я пробовал это: MATCH {} CREATE UNIQUE {} - [: contains] - (w: WORD {{name: '{}'}}) RETURN w, я столкнулся с той же проблемой. – blackmamba

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