2015-04-30 3 views
1

Скажем, у меня есть узел в базе данных с меткой L и несколькими случайными свойствами A = B, C = D и т. Д. Я хочу объединить другой узел в базе данных также с меткой L, но только обладает свойствами А = В.Cypher точно соответствует свойствам

С текущим Cypher, я мог бы просто сделать простой:

merge (node:L {A:B}) return node 

Но поскольку матч/слияние рассматривает любые узлы с этими свойствами рассчитывать, что будет объединен в первый узел. Есть ли способ получить это точное соответствие? Я думал сделать что-то вроде

merge (node:L {props}) where {props} == {all node's props} 

, но эта функциональность, чтобы перечислить все реквизит элементов узла не существует, хотя это на их top five ideas.

ответ

2

Если вы знаете, какие свойства вы хотите сравнить, это сделает трюк.

MATCH (node:L {a: "a"}) 
WHERE LENGTH(KEYS(node)) = 1 
WITH (CASE COUNT(node) WHEN 0 then [1] END) AS X 
FOREACH (x in X | create (a:L {a:"a"})); 

Номер на ДЛИНА линии должно быть равно числу свойств, которые вы хотите сравнить, в этом случае, один.

LENGTH(KEYS(node)) = 1 

EDIT 1 - тот же запрос, но возвращение Узла

MATCH (node:L {a: "a"}) 
WHERE LENGTH(KEYS(node)) = 1 
WITH (CASE COUNT(node) WHEN 0 then [1] END) AS X 
FOREACH (x in X | create (a:L {a:"a"})) 
with X 
MATCH (node:L {a: "a"}) return node; 
+1

Просто проверил это. Не знал о функции keys() – boses

+1

Вопрос: есть ли способ переписать это как функцию слияния, где он возвращает либо новый узел, либо узел уже там? – boses

+1

К сожалению, я не смог этого сделать. Вы можете вернуть X и проверить его значение. Он возвращает [1], если узел был создан или null, если он уже существует. Возможно, с этой информацией вы можете попытаться запустить другой запрос, чтобы получить нужный узел. – pablosaraiva

1

Если вы точно знаете, какие имена свойств вы хотите исключить, если вы определяете, есть ли какие-либо соответствия (до создания узла), вы можете сделать что-то вроде следующего. В этом примере свойства, которые следует исключать при определении совпадения, это «C», «D» и «E».

OPTIONAL MATCH (node:L {A: "B"}) 
WHERE NOT (has(node.C) OR has(node.D) OR has(node.E)) 
WITH (CASE WHEN node IS NULL THEN [1] ELSE [] END) AS cn 
FOREACH (x IN cn | CREATE (:L {A: "B"})) 
RETURN cn[0]; 

Возвращаемое значение будет 1, если узел был создан, или null, если это не было.

+0

Спасибо, но я определенно не знаю, свойство, которые я хочу, чтобы исключить только те свойства, которые я хочу, чтобы включить. – boses

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