在向前推进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();
}
答案 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)
ExecuteWithoutResults
。您问题中的第一个代码示例缺少此功能。这在https://bitbucket.org/Readify/neo4jclient/wiki/cypher