0

我想避免在查询语句中使用参数注入。因此,我们使用了 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 而不是在语句中注入变量。

非常感谢!

4

1 回答 1

2

有人可以帮我们调试这段代码的问题吗?

https://bitbucket.org/Readify/neo4jclient/wiki/cypher上有一个标题为“调试”的部分描述了如何执行此操作。

不过,至于您的核心问题,您的方法是遇到 Cypher 限制。参数用于未编译到查询计划中的查询部分。但是,匹配子句是。

Neo4j 文档

参数可用于 WHERE 子句中的文字和表达式,用于 START 子句中的索引键和索引值,索引查询,最后用于节点/关系 ID。参数不能用作属性名称,因为属性表示法是编译到查询计划中的查询结构的一部分。

您可以执行以下操作:

.Match("a-[Rel:]->foundClass")
.Where("type(Rel) = {relationshipType}")
.WithParam("relationshipType", relationshipType)

(免责声明:我只是在这里输入的。我根本没有测试过。)

不过这可能会更慢,因为您需要检索所有关系,然后测试它们的类型。你应该测试一下。将 match 子句编译到查询计划中是有原因的。

于 2013-06-04T03:43:41.780 回答