Node.ByIndexLookup和Where子句抛出异常

时间:2013-10-01 08:07:33

标签: neo4jclient

我试图理解为什么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表达式,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\CypherFluentQuery Where.cs:第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\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种方法中的哪一种是查询性能原因的首选方法。

此致 基兰

1 个答案:

答案 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中的遍历快速闪电,而且你只做了一次索引查找。说实话可能不是很多......