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 (или, по крайней мере, нескольких из них), а не в скрипте. Если у вас есть только несколько разных меток, это, вероятно, работает хорошо, но не масштабируется для многих меток.

  1. MATCH(n), где длина(метки (n)) = 0 и n.type = ' XX ' SET n: XX;
  2. 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

From