在处理数据和数据库时,经常会遇到需要将数据从一种格式转换到另一种格式的情况。最近,面临了这样一个挑战:将JSON格式的用户数据导入到Neo4j图数据库中。这对来说是一次全新的尝试,因为之前没有做过类似的事情。
常用编程语言是C#,并且对Cypher查询语言也有一定的了解。因此,第一个想法是开发一个工具,将JSON数据转换成Cypher语句。
首先,需要创建节点。以下是使用C#编写的代码片段,用于生成创建节点的Cypher语句:
private void GenerateNodesCypher()
{
string filename = @"..\..\output\nodes.cql";
var output = new StringBuilder();
foreach (var user in _userList)
{
string s = $@"
CREATE ({user.username}:User {{
userid: {user.userid}, username: '{user.username}',
avatar: '{user.avatar}'
}} );";
output.AppendLine(s);
}
File.WriteAllText(filename, output.ToString());
}
这段代码遍历用户列表,为每个用户生成一个创建节点的Cypher语句,并将这些语句写入到一个文件中。
接下来,需要创建用户之间的关系。以下是编写的代码片段,用于生成创建关系的Cypher语句:
private void GenerateRelationshipsCypher()
{
string filename = @"..\..\output\relationships.cql";
var output = new StringBuilder();
int n = 0;
foreach (var user in _userList)
{
foreach (var following in user.following)
{
string s = $@"
MATCH (a), (b) WHERE a.username =
'{user.username}' AND b.username = '{following}'
CREATE (a)-[:FOLLOWING]->(b);";
output.AppendLine(s);
n++;
}
}
File.WriteAllText(filename, output.ToString());
}
这段代码遍历用户列表,为每个用户创建与他们关注的用户之间的关系,并生成相应的Cypher语句。
在将数据导入Neo4j的过程中,遇到了一些问题,以下是遇到的问题以及是如何解决它们的:
首先尝试使用Neo4j浏览器运行创建语句,但遇到了问题,因为Neo4j浏览器不能运行以分号结尾的多个语句。移除了分号,但随后出现了错误:
WITH is required between CREATE and MATCH
在Stack Overflow上找到了一个解决方法,如下所示:
MATCH (a), (b) WHERE a.username = 'user_1' AND b.username = 'user_14' CREATE (a)-[:FOLLOWING]->(b);
WITH 1 as dummy MATCH (a), (b) WHERE a.username = 'user_1' AND b.username = 'user_22' CREATE (a)-[:FOLLOWING]->(b);
但是,如果数据中有些用户不存在,这种方法就无法继续执行后续的关系创建。
使用默认设置安装了Neo4j,但启动Shell时遇到了问题。尝试在Neo4j的安装目录下运行批处理文件,但收到了错误信息:
The system cannot find the path specified. Error: Could not find or load main class org.neo4j.shell.StartClient
正确的方法是使用Neo4j服务器应用程序,点击“选项”->“命令提示符”,这将启动Neo4j命令提示符,然后可以轻松地运行:
neo4jshell -file nodes.cql
neo4jshell -file relationships.cql
Exiting with unterminated multi-line input