使用C#驱动程序读取Neo4j查询的结果

时间:2018-12-19 20:38:55

标签: neo4j cypher

我已经成功地通过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;
        }

正如您所见,我已经尝试使用这些键,但是这种方法无法正常工作。我要尝试的只是获取计数以查看此节点是否存在。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以尝试让Cypher进行存在性检查,然后返回布尔结果:

MATCH (a:User {UserId: $UserId}) 
RETURN count(a) > 0 as exists

我认为在这里检查键不是正确的方法,因为键不是结果数,而是返回的变量(例如查询中的a和我中的exists ),并且无论您有0个结果还是多个结果,这些值都应保持不变。

这里是IStatementResult界面,供您参考使用哪种方法来消耗结果。

正如Guy Coder上面评论的那样,如果您的意图是创建一个不存在的新节点(或者使用现有节点),您也可以考虑使用MERGE。