0

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

简单设置
root-[:has_user]->user 和 user-[:friends_with]->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 年 11 月 12 日更新

得到它的工作。我首先使用稳定的 1.8 由 Neo4J 实例更新。我认为最新的 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();
        }
4

2 回答 2

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)

于 2012-11-12T13:47:30.650 回答
0
  1. 使用 1.0.0.500 之后的任何 Neo4jClient 版本。如果您对原因感兴趣,请参阅第 45 期。
  2. 别忘了打电话ExecuteWithoutResults。您问题中的第一个代码示例缺少此内容。这记录在https://bitbucket.org/Readify/neo4jclient/wiki/cypher
于 2013-03-22T04:50:37.867 回答