neo4jClient 使用参数创建带有动态标签的节点
neo4jClient create node with dynamic label using paramters
我正在构建一个应用程序,让用户能够构建自己的图表。我一直在为所有查询和创建使用参数。但是当我想让用户能够创建一个节点时,他们也可以在其中标记任何他们想要的东西(尊重 neo4j 对空字符串标签的限制)。我将如何参数化这种类型的交易?
我试过这个:
.CREATE("(a:{dynamicLabel})").WithParams(new {dynamicLabel = dlabel})...
但这会导致 neo 出现语法错误。我很想连接,但担心这可能会给我的应用程序带来注入风险。
我很想建立自己的 class 来读取预期的字符串并拒绝任何类型的 neo 语法,但这会稍微限制我的用户,我宁愿不这样做。
有一个开放的neo4j issue 4334,这是一个功能请求,用于在CREATE
期间添加参数化标签的能力。所以,这还不可能。
该问题包含一条评论,建议生成带有硬编码标签的 CREATE
语句,这将起作用。不幸的是,它的性能不如使用参数(在这种情况下应该支持它)。
如果您使用的是 Java 客户端,那么您可以这样做。
Node node = GraphDatabaseService.createNode();
Label label = new Label() {
@Override
public String name() {
return dynamicLabelVal;
}
};
node.addLabel(label);
然后您可以拥有一个 LabelCache,这将避免为每个节点创建 Label 对象。
我苦苦寻找,终于找到了。
你可以这样做:
// 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"
}
]
}
我正在构建一个应用程序,让用户能够构建自己的图表。我一直在为所有查询和创建使用参数。但是当我想让用户能够创建一个节点时,他们也可以在其中标记任何他们想要的东西(尊重 neo4j 对空字符串标签的限制)。我将如何参数化这种类型的交易?
我试过这个:
.CREATE("(a:{dynamicLabel})").WithParams(new {dynamicLabel = dlabel})...
但这会导致 neo 出现语法错误。我很想连接,但担心这可能会给我的应用程序带来注入风险。
我很想建立自己的 class 来读取预期的字符串并拒绝任何类型的 neo 语法,但这会稍微限制我的用户,我宁愿不这样做。
有一个开放的neo4j issue 4334,这是一个功能请求,用于在CREATE
期间添加参数化标签的能力。所以,这还不可能。
该问题包含一条评论,建议生成带有硬编码标签的 CREATE
语句,这将起作用。不幸的是,它的性能不如使用参数(在这种情况下应该支持它)。
如果您使用的是 Java 客户端,那么您可以这样做。
Node node = GraphDatabaseService.createNode();
Label label = new Label() {
@Override
public String name() {
return dynamicLabelVal;
}
};
node.addLabel(label);
然后您可以拥有一个 LabelCache,这将避免为每个节点创建 Label 对象。
我苦苦寻找,终于找到了。 你可以这样做:
// 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"
}
]
}