如何使用.NET Client WithParms而不是注入来查询Neo4J?

时间:2013-06-03 21:58:16

标签: neo4j cypher neo4jclient

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

  

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

标题为“调试”的https://bitbucket.org/Readify/neo4jclient/wiki/cypher部分介绍了如何执行此操作。

至于你的核心问题,你的方法正在达到Cypher的限制。参数用于查询中未编译到查询计划中的部分。但是匹配条款。

来自the Neo4j documentation

  

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

您可以执行以下操作:

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

(免责声明:我刚刚在这里打字。我根本没有测试过。)

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