我一直在尝试使用neo4jphp [https://github.com/jadell/neo4jphp/wiki]为我们的新模块创建节点和关系。
我正在使用cypher查询。
$queryNodes = "CREATE (n:User { props } ) ";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryNodes, array('props' => $arrNodeProperties));
$result = $query->getResultSet();
$queryRelations = "
MATCH (authUser: User { userid: 0001 }),(friend)
WHERE friend.userid IN ['" . implode("','",$relations) . "']
CREATE UNIQUE (authUser)-[r:KNOWS { connection: 'user_friend' }]->(friend)";
到目前为止,节点创建工作正在进行中。
但是当我尝试为节点创建唯一关系时,它需要太长时间......
注意: 标签User有唯一的约束userid,因此标签user的节点由属性userid上的Neo4j索引。
CREATE CONSTRAINT ON (user:User) ASSERT user.userid IS UNIQUE
答案 0 :(得分:1)
您可以尝试使用MERGE
代替CREATE UNIQUE
。另外,在客户端使用Cypher参数作为fried列表而不是串联,请参阅http://docs.neo4j.org/chunked/stable/cypher-parameters.html
答案 1 :(得分:0)
最后,我做了很多改变......
感谢@MichaelHunger的帮助。
所以我就是这样做的......
$queryNodes = "
FOREACH (nodeData IN {nodeProperties}|
MERGE (n:User { userid: nodeData.userid })
ON CREATE SET
n.login = nodeData.login,
n.userid = nodeData.userid,
n.username = nodeData.username,
n.name = nodeData.name,
n.gender = nodeData.gender,
n.profile_pic = nodeData.profile_pic,
n.create_date = timestamp()
ON MATCH SET
n.update_date = timestamp()
)
";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryNodes, array('nodeProperties' => $arrNodeProperties));
$result = $query->getResultSet();
$queryRelations = "
MATCH (authUser: User { userid: {authUserid} }), (friend:User)
WHERE friend.userid IN {friendUserIds}
CREATE UNIQUE (authUser)-[r:KNOWS { connection: 'user_friend' }]->(friend)
";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryRelations, array('friendUserIds' => $arrFriendUserId, 'authUserid' => $authUserid));
$result = $query->getResultSet();
如果我们可以进一步改善,请发表评论。