将密码“WHERE IN”子句转换为Neo4JClient

时间:2015-04-22 03:07:18

标签: c# neo4jclient

如何将以下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
"
         ^

1 个答案:

答案 0 :(得分:1)

假设top:10userData,我建议尝试这个

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查询的直接翻译,因为它不会返回创建的关系。