如何使用Neo4jClient删除关系

时间:2012-11-09 23:17:30

标签: neo4j neo4jclient

在向前推进neo4j之前,我试图了解基础知识。喜欢查询方面,但现在尝试使用neo4jclient删除并卡住。

简单的设置
根 - [:has_user] - >用户 和 用户 - [:friends_with] - GT; friend`

对于ID为1的用户,我想删除指定的ID == 2.用户1不再是用户2的朋友:(

无论如何,使用neo4jclient我首先检查以确保用户首先是这样的朋友:

if (client.Cypher.Start("root", client.RootNode)
    .Match("root-[:HAS_USER]->user-[:FRIEND]->friend")
    .Where((UserNode user, UserNode friend) => user.Id == 1 && friend.Id == id)
    .Return<Node<UserNode>>("user")
    .Results
    .Count() == 1)
{

现在我想删除:

    client.Cypher.Start("root", client.RootNode)
        .Match("root-[:HAS_USER]->user-[r]->friend")
        .Where("user.Id = 1")
        .And()
        .Where("friend.Id = " + id)
        .And()
        .Where(string.Format("type(r) = 'FRIEND'"))                
        .Delete("r");
}

没有错误,但关系仍然存在。有任何想法吗?

2012年12月12日更新

搞定了。我首先用Neo4J实例更新了稳定1.8 。我觉得最新的neo4jclient和neo4j服务器没有合作。我首先根据id获取用户的节点,然后从该节点测试节点是否有关系,然后能够将其删除。代码如下:

        var currentUserNode = client.Cypher.Start("root", client.RootNode)
            .Match("root-[:HAS_USER]->user")
            .Where((UserNode user) => user.Id == 1)
            .Return<Node<UserNode>>("user")
            .Results.Single();

        if (currentUserNode.StartCypher("user")
                .Match("user-[r]->friend")
                .Where("friend.Id = " + id).And()
                .Where("type(r) = 'FRIEND'")
            .Return<Node<UserNode>>("user")
            .Results
            .Count() == 1)
        {

            currentUserNode.StartCypher("user")
                .Match("user-[r]->friend")
                .Where("friend.Id = " + id).And()
                .Where("type(r) = 'FRIEND'")
                .Delete("r").ExecuteWithoutResults();
        }

2 个答案:

答案 0 :(得分:0)

一种方法是切换到使用CypherFluentQuery:

new CypherFluentQuery(client)
    .Start("root", client.RootNode)
    .Match("root-[:HAS_USER]->user-[r]->friend")
    .Where("user.Val = 1").And()
    .Where("friend.Val = " + 2).And()
    .Where("type(r) = 'FRIEND'")
    .Delete("r").ExecuteWithoutResults();

会做你想做的事。

我相信这一切都源于一个错误:https://bitbucket.org/Readify/neo4jclient/issue/40/should-be-able-to-add-cypher-delete-clause

至于为什么client.Cypher.Start没有按预期工作,我不确定,错误是否已修复,应该是从1.0.0.479开始工作(目前编写的是1.0.0.496)

答案 1 :(得分:0)

  1. 在1.0.0.500之后使用任何Neo4jClient构建。如果您对原因感兴趣,请参阅issue 45
  2. 不要忘记致电ExecuteWithoutResults。您问题中的第一个代码示例缺少此功能。这在https://bitbucket.org/Readify/neo4jclient/wiki/cypher
  3. 中有记录