我的节点没有标签但属性NodeType
有没有办法用NodeType属性的值设置那些节点的标签?
谢谢!
答案 0 :(得分:4)
不,目前没有可能用变量定义标签。
您必须在应用程序中执行此操作,方法是获取要在其上添加标签的所有节点,然后发送Cypher Query以添加此标签。
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;
}
答案 1 :(得分:3)
您不能使用变量,但您仍然可以在密码查询(或至少其中一些)而不是脚本中执行此操作。如果您只有少量不同的标签,这可能效果很好,但对于许多标签而言不是那么可扩展。
例如
- MATCH(n)WHERE length(labels(n))= 0和n.type ='XX'SET n:XX;
- MATCH(n)WHERE长度(标签(n))= 0和n.type ='XY'SET n:XY;
醇>
答案 2 :(得分:0)
黑客解决方案是让Cypher查询看起来像:
start n=node({nodeId})
set n :LABEL with n
return labels(n)
对此查询运行一些文本操作,以便插入标签。这是一个java示例:
String setNodeLabelQuery = getQueryString();
setNodeLabelQuery = setNodeLabelQuery.replaceFirst("LABEL", "LABEL_B);
其中getQueryString()
是返回查询字符串的方法。
答案 3 :(得分:0)
使用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