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"
     }
   ]
 }