我试图理解为什么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
堆栈跟踪的详细信息如下
c:\ TeamCity \ buildAgent \ work \ f1c4cf3efbf1b05e \ Neo4jClient \ Cypher \ CypherWhereExpressionVisitor.cs中的Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitMember(MemberExpression节点):第145行 System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor) System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点) C:\ TeamCity \ buildAgent \ work \ f1c4cf3efbf1b05e \ Neo4jClient \ Cypher \ CypherWhereExpressionVisitor.cs中的Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitBinary(BinaryExpression节点):第65行 System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点) System.Linq.Expressions.ExpressionVisitor.VisitLambda [T](Expression
1 node) System.Linq.Expressions.Expression
1.Accept(ExpressionVisitor visitor) System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点) Neo4jClient.Cypher.CypherWhereExpressionBuilder.BuildText(LambdaExpression表达式,Func2 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\CypherFluentQuery
Where.cs:第11行 Neo4jClient.Cypher.CypherFluentQuery.Mutate(Action1 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\CypherFluentQuery
Where.cs:第10行 Neo4jClient.Cypher.CypherFluentQuery.Where [T1](表达式1 expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery
Where.cs:第34行
只是想知道这里有什么区别&amp;当boath工作时,2种方法中的哪一种是查询性能原因的首选方法。
此致 基兰
答案 0 :(得分:1)
好的,我有一个解决方案可以让代码正常工作,但要让它在你现有的工作中运行,你需要在Neo4jClient Issues Page处输入一个功能请求/错误报告。 Issue 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中的遍历快速闪电,而且你只做了一次索引查找。说实话可能不是很多......