我想避免在查询语句中使用parms注入。因此,我们使用了NEO4J .NET客户端类中的以下指令:
var queryClassRelationshipsNodes = client.Cypher
.Start("a", (NodeReference)sourceReference.Id)
.Match("a-[Rel: ***{relationshipType***} ]->foundClass")
.Where("Rel.RelationStartNode =" + "\'" + relationshipStart + "\'")
.AndWhere("Rel.RelationDomainNode =" + "\'" + relationshipDomain + "\'")
.AndWhere("Rel.RelationClassNode =" + "\'" + relationshipClass + "\'")
.WithParam("relationshipType", relationshipType)
.Return<Node<Dictionary<string, string>>>("foundClass")
.Results;
但是,一旦服务器执行此代码,它就不起作用。出于某种原因,PARM:relationshipType与我们放在{}之间的变量没有关联。
有人可以帮我们用这段代码调试问题吗?我们更愿意使用WithParms而不是在语句中注入变量。
非常感谢!
答案 0 :(得分:2)
有人可以帮我们用这段代码调试问题吗?
标题为“调试”的https://bitbucket.org/Readify/neo4jclient/wiki/cypher部分介绍了如何执行此操作。
至于你的核心问题,你的方法正在达到Cypher的限制。参数用于查询中未编译到查询计划中的部分。但是匹配条款。
参数可用于WHERE子句中的文字和表达式,用于START子句中的索引键和索引值,索引查询以及最后用于节点/关系id。参数不能用作属性名称,因为属性表示法是编译到查询计划中的查询结构的一部分。
您可以执行以下操作:
.Match("a-[Rel:]->foundClass")
.Where("type(Rel) = {relationshipType}")
.WithParam("relationshipType", relationshipType)
(免责声明:我刚刚在这里打字。我根本没有测试过。)
但这可能会慢一些,因为您需要检索所有关系,然后测试它们的类型。你应该测试一下。将match子句编译到查询计划中是有原因的。