java - 使用带有属性映射的 Cypher CREATE 命令,来自 Java

标签 java scala neo4j cypher

我正在努力从我的 Java (Scala) 代码中使用 CypherNeo4J 中创建一个节点。需要帮助。

我有一个应用类:

case class Team (val name: String,
             val contactEmail: String)

和相应的 jsonifying 辅助函数:

def toNodeProperties = {
   ("props" ->
      ("name"           -> name) ~
      ("contactEmail"   -> contactEmail)
   )
} // Using json4s

现在,我想从 this 的一个实例在 Neo4J 实例上创建一个节点。所以,这就是我尝试过的:

val t = pretty(render(Team("myTeam","team@gmail.com").toNodeProperties))

当我打印“t”时,我看到了这个:

{
  "props" : {
    "name" : "myTeam",
    "contactEmail" : "team@gmail.com",
  }
}

然后,我尝试创建一个语句,因此:

val cypherCreateCommand = "CREATE (t:TestEntity  " + t + ")"
val v1 = db.execute(cypherCreateCommand)

Runtime 表示不满:

Invalid input '"': expected whitespace, comment, a property key name, '}', an identifier or UnsignedDecimalInteger (line 2, column 3 (offset: 26)) " "props" : {" ^

我认为一个 JSONIfied 字符串作为 CREATE 的参数应该是显而易见的事情,但它似乎不是。有人可以指出我犯的错误吗?

以防万一,这里是pom.xml的相关部分:

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <encoding>UTF-8</encoding>
    <scala.tools.version>2.10</scala.tools.version>
    <scala.version>2.10.5</scala.version>
</properties>

  <dependency>
      <groupId>org.json4s</groupId>
      <artifactId>json4s-jackson_2.10</artifactId>
      <version>3.2.11</version>
  </dependency>

  <dependency>
      <groupId>org.json4s</groupId>
      <artifactId>json4s-native_2.10</artifactId>
      <version>3.2.11</version>
  </dependency>


  <dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>${scala.version}</version>
  </dependency>

<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.7</version>
</dependency>
  <dependency>
      <groupId>com.github.nscala-time</groupId>
      <artifactId>nscala-time_2.10</artifactId>
      <version>2.2.0</version>
  </dependency>

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j</artifactId>
  <version>2.2.5</version>
</dependency>


<!-- Test -->
  <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_2.10</artifactId>
      <version>2.2.5</version>
  </dependency>
  <dependency>
      <groupId>org.neo4j</groupId>
      <artifactId>neo4j-kernel</artifactId>
      <version>2.2.5</version>
      <type>test-jar</type>
      <scope>test</scope>
  </dependency>
  // .... and the rest

最佳答案

首先 - 你应该使用 GraphDatabaseService::execute(String query, Map<String, Object> params)方法,如果你有参数化查询

使用此方法(而不是字符串连接)为 Neo4j 提供了更有效地编译查询然后重用它的可能性。


对于您的情况,我认为这应该可行:

(我不擅长 Scala,所以这是 Java 代码。但是,我认为它应该是不言自明的)

Map<String, Object> params = new HashMap<>();
params.put("props", new HashMap<String, Object>() {
    add("name", name);
    add("contactEmail", contactEmail);
});

String query = "CREATE (t:TestEntity  {props})"
db.execute(query, params);

注意:我没有测试过这段代码。

我们做了什么:

  • 创建 params容器
  • 输入props映射到 params容器
  • query带有特殊占位符(类似于关系数据库中的准备语句)
  • 执行query指定 params

编辑(@Nirmalya):detailed description about cypher parameters from neo4j docs .

关于java - 使用带有属性映射的 Cypher CREATE 命令,来自 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32708549/

相关文章:

java - java中的Pig UDF :Error ---ERROR 1066: Unable to open iterator for alias

java - final 成员变量有利于更好的 GC 吗?

scala - 如何从交叉验证器获得经过训练的最佳模型

graph - 密码:如何返回不同的关系类型?

java - php - 在数据库中存储发布的 JSON 对象

scala - 在 scalatest 中创建和删除 scala 光滑表之前和之后的异步

scala - mapN 组合应用

java - 遍历整个标签

python - 使用Python将Graphml文件导入neo4j并将其导出为CSV

java - 在 setAdapter 上,它不会调用 Adapter 的 getView 方法