我正在努力从我的 Java (Scala) 代码中使用 Cypher 在 Neo4J 中创建一个节点。需要帮助。
我有一个应用类:
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/