如何将以下cyper查询转换为Neo4JClient
MATCH (user:User),(interest:Interest)
WHERE interest.Id IN [2,4,9,17] AND user.Id = 46
CREATE user-[rel:INTERESTED_IN]->interest
RETURN rel
我所做的是
await graphClient.Cypher
.Match("(interest:Interest)", "(user:User)")
.Where((Interest interest) => interests.Contains(interest.Id))
.AndWhere((User user) => user.Id == userData)
.CreateUnique("user-[INTERESTED_IN]->interest")
.ExecuteWithoutResultsAsync();
userData和兴趣是先前在方法中定义的变量
我的代码抛出以下异常
SyntaxException: Invalid input 't' (line 2, column 13)
"WHERE {p0}interest.Id
"
^
答案 0 :(得分:1)
假设top:10
是userData
,我建议尝试这个
int
为var userData = 46;
var interestIds = new[] { 2, 4, 9, 17 };
await _client.Cypher
.Match("(interest:Interest), (user:User)")
.Where((User user) => user.Id == userData)
.AndWhere("interest.Id IN {interestIds}")
.WithParams(new { interestIds })
.ExecuteWithoutResultsAsync();
谓词编写Cypher可能更容易,而不是将它们写入C#然后被转换回来。然后根据Neo4jClient documentation:
Cypher参数是将动态信息注入查询的安全方法。它们可以避免基于注入攻击的风险,并确保您的值得到准确编码。
它们还显着改善了Neo4j端的查询计划缓存,因为查询文本没有变化,因此Neo4j不必在每次点击时重新编译计划。
另请注意,这不是原始Cypher查询的直接翻译,因为它不会返回创建的关系。