我已经成功地通过c#在本地Neo4j图形中创建了一个新的Node。现在,在为用户创建新节点之前,我试图确定用户是否在图中存在。这是我的代码:
using Neo4j.Driver.V1;
readonly string uri = "bolt://localhost:7687";
readonly string user = "user";
readonly string password = "password";
_driver = GraphDatabase.Driver(uri, AuthTokens.Basic(user, password));
private bool checkForUser(string userId)
{
bool userFound = false;
using (var session = _driver.Session())
{
var checkUser = session.WriteTransaction(userCheckResults =>
{
var checkUserResult = userCheckResults.Run("MATCH (a:User {UserId: '" + userId + "'}) RETURN a");
//alternate method var checkUserResult = userCheckResults.Run("MATCH (a:User {UserId: $UserId}) RETURN a", new { userId });
if (checkUserResult.Keys.Count > 0)
{
userFound = true;
}
return checkUserResult;
//also tried this line here to-- return createUserResult.Single();[0].As<string>()
});
}
return userFound;
}
正如您所见,我已经尝试使用这些键,但是这种方法无法正常工作。我要尝试的只是获取计数以查看此节点是否存在。非常感谢您的帮助。
答案 0 :(得分:0)
您可以尝试让Cypher进行存在性检查,然后返回布尔结果:
MATCH (a:User {UserId: $UserId})
RETURN count(a) > 0 as exists
我认为在这里检查键不是正确的方法,因为键不是结果数,而是返回的变量(例如查询中的a
和我中的exists
),并且无论您有0个结果还是多个结果,这些值都应保持不变。
这里是IStatementResult界面,供您参考使用哪种方法来消耗结果。
正如Guy Coder上面评论的那样,如果您的意图是创建一个不存在的新节点(或者使用现有节点),您也可以考虑使用MERGE。