1

我试图了解为什么 neo4jClient 会引发异常,希望这里的人可以帮助我更好地了解发生了什么。

首先以下代码有效!

            qry = qry.Start(new 
        { 
            city = Node.ByIndexLookup(model.City.IndexName, "Label", data.RegistredAddress.City),
            state = Node.ByIndexLookup(model.State.IndexName, "Label", data.RegistredAddress.State),
            country = Node.ByIndexLookup(model.Country.IndexName, "Label", data.RegistredAddress.Country),
        });
        qry = qry.Match("(city)-[:BELONGS_TO_STATE]->(state)-[:BELONGS_TO_COUNTRY]-(country)").Return<Node<model.City>>("city");

但是当我用下面的不同结构替换它时,它会引发异常

            qry = qry.Start(new 
        { 
            city = Node.ByIndexLookup(model.City.IndexName, "Label", data.RegistredAddress.City),
        });
        qry = qry.Match("(city)-[:BELONGS_TO_STATE]->(state)-[:BELONGS_TO_COUNTRY]-(country)");
        qry = qry.Where<model.State>(state => state.Label == data.RegistredAddress.State);
        qry = qry.AndWhere<model.Country>(country => country.Label == data.RegistredAddress.Country);
        var finalQry = qry.Return<Node<model.City>>("city");

我在尝试添加 Where 子句的行出现异常。

System.NotSupportedException: Unhandled node type MemberAccess in MemberExpression: value

堆栈跟踪的详细信息如下

Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitMember(MemberExpression 节点)在 c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionVisitor.cs:第 145 行 System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor 访问者)System.Linq。 Expressions.ExpressionVisitor.Visit(表达式节点) Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitBinary(BinaryExpression 节点)在 c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionVisitor.cs:第 65 行 System.Linq.Expressions.BinaryExpression。 Accept(ExpressionVisitor 访问者) System.Linq.Expressions.ExpressionVisitor.Visit(Expression 节点) System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression1 node) System.Linq.Expressions.Expression1.Accept(ExpressionVisitor visitor) System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) Neo4jClient.Cypher.CypherWhereExpressionBuilder.BuildText(LambdaExpression 表达式, Func 2 createParameterCallback) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionBuilder.cs: line 15 Neo4jClient.Cypher.CypherFluentQuery.<>c__DisplayClassd.<Where>b__c(QueryWriter w) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQueryWhere.cs: line 11 Neo4jClient.Cypher.CypherFluentQuery.Mutate(Action 1 callback) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery.cs: line 40 Neo4jClient.Cypher.CypherFluentQuery.Where(LambdaExpression expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQueryWhere.cs :第 10 行 Neo4jClient.Cypher.CypherFluentQuery.Where[T1](表达式1 expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQueryWhere.cs:第 34 行

只是想知道这里有什么区别以及两种方法中的哪一种是在 boath 工作时查询性能原因的首选方法。

问候基兰

4

1 回答 1

1

好的,我有一个可以让代码工作的解决方案,但要让它像你目前拥有的那样工作,你需要在Neo4jClient 问题页面上提交功能请求/错误报告。 已提出问题 151 。

一、解决办法:

您需要获取RegisteredAddress数据对象的一部分并将其放入另一个对象中,因此:

var registeredAddress = data.RegisteredAddress;

然后在您的查询中使用它:

var qry = qry.Where((model.State state) => state.Label == registeredAddress.State);

这将起作用并为您提供您想要/需要的结果。

原因:

Neo4jClient 获取您的 lambda 表达式并使用ExpressionVisitor基于类的内部解析它。目前,这只会在寻找“常量”表达式(即实际值)方面深入一层。因为data.RegisteredAddress.State是 2 个表达式的深度,所以它找不到常量表达式,因此不能在查询中使用它。

表现

我不确定,但我会认为后一种方法是最快的,因为 Neo4j 中的遍历速度快如闪电,而且您只进行了一次索引查找。老实说,它可能没有很多...

于 2013-10-01T13:03:34.953 回答