neo4j-как установить метку со значением свойства
У меня есть узлы без метки, но свойство NodeType
есть ли способ установить метку этих узлов со значением свойства NodeType?
спасибо!
4 ответов
нет, в настоящее время нет возможности определить этикетки с переменной.
вы должны сделать это в своем приложении, выбрав все узлы, которые вы хотите добавить метку на нем и отправив запрос шифрования для добавления этой метки.
быстрый пример в PHP:
$nodes = $client->sendCypherQuery('MATCH (n) WHERE n.nodeType = "MyType" RETURN n');
foreach ($nodes as $node) {
$label = $node->getProperty('nodeType');
$id = $node->getId();
$client->sendCypherQuery('MATCH (n) WHERE id(n) = '.$id.' SET n :'.$label;
}
вы не можете использовать переменную, но вы все равно можете сделать это в запросе cypher (или, по крайней мере, нескольких из них), а не в скрипте. Если у вас есть только несколько разных меток, это, вероятно, работает хорошо, но не масштабируется для многих меток.
- MATCH(n), где длина(метки (n)) = 0 и n.type = ' XX ' SET n: XX;
- MATCH(n), где длина(метки (n)) = 0 и n.type = ' XY ' SET n:XY;
решение для взлома было бы иметь запрос шифрования, который выглядит примерно так:
start n=node({nodeId})
set n :LABEL with n
return labels(n)
и выполните некоторые текстовые манипуляции с этим запросом, чтобы вставить метку. Вот пример java:
String setNodeLabelQuery = getQueryString();
setNodeLabelQuery = setNodeLabelQuery.replaceFirst("LABEL", "LABEL_B);
здесь getQueryString()
- это метод, который возвращает строку запроса.
использование Cypher и APOC для перемещения значения свойства в метку
// create a node with property studio
create (n:Movies {name: 'A Few Good Men', studio: 'Warner Brothers'})
// move the 'studio' property to a label and remove it as a property
MATCH (n:Movies)
call apoc.create.addLabels([ id(n) ], [ n.studio ]) yield node
with node
remove node.studio
return node