我正在构建一个应用程序,使用户能够构建自己的图形。我一直在为所有查询使用参数并创建。但是,当我想让用户能够创建一个节点时,他们也可以将它标记为任何他们想要的东西(尊重对空字符串标签的neo4j限制)。我如何参数化这种类型的交易?
我试过了:
.CREATE("(a:{dynamicLabel})").WithParams(new {dynamicLabel = dlabel})...
但这会产生neo的语法错误。我很想连接,但我担心这可能会给我的应用程序带来注入风险。
我很想建立我自己的类来读取预期的字符串并拒绝任何类型的neo语法,但这会限制我的用户一点,我宁愿不这样做。
答案 0 :(得分:1)
有一个开放的neo4j issue 4334,这是一项功能请求,用于在CREATE
期间添加参数化标签的功能。所以,这还不可能。
该问题包含一条评论,建议使用硬编码标签生成CREATE
语句,这些语句都可以使用。遗憾的是,它不像使用参数那样有效(在这种情况下是否应该支持)。
答案 1 :(得分:0)
如果您使用的是Java客户端,则可以这样做。
Node node = GraphDatabaseService.createNode();
Label label = new Label() {
@Override
public String name() {
return dynamicLabelVal;
}
};
node.addLabel(label);
然后,您可以拥有一个LabelCache,它将避免为每个节点创建Label对象。
答案 2 :(得分:0)
我搜索得像地狱一样,终于找到了。 您可以这样做:
// create or update nodes with dynamic label from import data
WITH "file:///query.json" AS url
call apoc.load.json(url) YIELD value as u
UNWIND u.cis as ci
CALL apoc.merge.node([ ci.label ], {Id:ci.Id}, {}, {}) YIELD node
RETURN node;
JSON如下所示:
{
"cis": [
{
"label": "Computer",
"Id": "1"
},
{
"label": "Service",
"Id": "2"
},
{
"label": "Person",
"Id": "3"
}
],
"relations": [
{
"end1Id": "1",
"Id": "4",
"end2Id": "2",
"label": "USES"
},
{
"end1Id": "3",
"Id": "5",
"end2Id": "1",
"label": "MANAGED_BY"
}
]
}