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
  1. 1.0.0.500 以降の Neo4jClient ビルドを使用します。その理由に興味がある場合は、問題 45を参照してください。
  2. 電話することを忘れないでくださいExecuteWithoutResults。質問の最初のコード サンプルには、これがありません。これはhttps://bitbucket.org/Readify/neo4jclient/wiki/cypherで文書化されています
于 2013-03-22T04:50:37.867 に答える
0

1 つの方法は、代わりに 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 に答える