neo4jClient使用参数创建带动态标签的节点

时间:2015-08-24 01:05:55

标签: neo4j neo4jclient

我正在构建一个应用程序,使用户能够构建自己的图形。我一直在为所有查询使用参数并创建。但是,当我想让用户能够创建一个节点时,他们也可以将它标记为任何他们想要的东西(尊重对空字符串标签的neo4j限制)。我如何参数化这种类型的交易?

我试过了:

.CREATE("(a:{dynamicLabel})").WithParams(new {dynamicLabel = dlabel})... 

但这会产生neo的语法错误。我很想连接,但我担心这可能会给我的应用程序带来注入风险。

我很想建立我自己的类来读取预期的字符串并拒绝任何类型的neo语法,但这会限制我的用户一点,我宁愿不这样做。

3 个答案:

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