Node.ByIndexLookup и предложение Where, вызывающее исключение

Я пытаюсь понять, почему 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(Expression) System.Linsitor visitor Expressions.ExpressionVisitor.Visit(узел выражения) Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitBinary(узел BinaryExpression) в c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionVisitor.cs: строка 65 System.Linq.Expressions Accept(посетитель ExpressionVisitor) System.Linq.Expressions.ExpressionVisitor.Visitor(узел выражения) System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression1 node) System.Linq.Expressions.Expression1.Accept(посетитель выражения ExpressionVisitor) 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\CypherFluentQueryWhere.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\CypherFluentQueryWhere.cs: строка 10 Neo4jClient.Cypher.CypherFluentQuery.Where[T1](Expression1 expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQueryWhere.cs: строка 34

Просто любопытно узнать, в чем здесь разница и какой из двух подходов является предпочтительным способом запроса по соображениям производительности, когда работает лодка.

С уважением Киран


person Kiran    schedule 01.10.2013    source источник
comment
Вы пытались сделать это для предложения Where: qry = qry.Where((Model model) => model.State.Label == data.RegistredAddress.State);, где «Модель» — это тип вашей модели (и эквивалент для AndWhere)   -  person Charlotte Skardon    schedule 01.10.2013
comment
@ChrisSkardon: я пробовал то же самое qry = qry.Where((model.State state) =› state.Label == data.RegistredAddress.State); но все равно не получается. Модель BTW здесь использует model = Repository.Neo4jModel; поэтому я изменил его соответственно   -  person Kiran    schedule 01.10.2013
comment
Просто чтобы уточнить, модель — это сокращение от пространства имен, использующего model = Repository.Neo4jModel; это пространство имен, в котором определен класс State.   -  person Kiran    schedule 01.10.2013
comment
Это исправлено в версии 1.0.0.599 благодаря запросу на вытягивание от @ChrisSkardon.   -  person Tatham Oddie    schedule 04.10.2013


Ответы (1)


Хорошо, у меня есть решение, которое заставит код работать, но чтобы заставить его работать так, как оно у вас есть сейчас, вам нужно отправить запрос функции/отчет об ошибке на Страница проблем Neo4jClient. Обнаружена проблема 151.

Во-первых, решение:

Вам нужно взять часть RegisteredAddress вашего объекта данных и поместить ее в другой объект, поэтому:

var registeredAddress = data.RegisteredAddress;

затем используйте это в своем запросе:

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

Это сработает и даст вам желаемые/нужные результаты.

Причина:

Neo4jClient берет ваше лямбда-выражение и анализирует его внутри, используя класс на основе ExpressionVisitor. На данный момент это будет углубляться только с точки зрения поиска «постоянных» выражений (т.е. фактических значений). Поскольку data.RegisteredAddress.State имеет глубину 2 выражения, он не может найти постоянное выражение и не может использовать его в запросе.

Производительность

Я не знаю наверняка, но я бы подумал, что последний подход был самым быстрым, поскольку обход в neo4j молниеносный, и вы сделали только один поиск по индексу. Там, наверное, не так уж и много, если честно...

person Charlotte Skardon    schedule 01.10.2013
comment
Я создал задачу в списке задач Neo4jClient (bitbucket.org/Readify/neo4jclient/issue/151/) - person Charlotte Skardon; 01.10.2013
comment
Спасибо, я подозревал, что что-то подобное должно происходить, теперь это работает. Кстати, еще один вопрос, который у меня есть, заключается в том, какой из двух подходов лучше запрашивать данные в neo4j, если мне нужно учитывать производительность. - person Kiran; 02.10.2013
comment
Я сделал запрос на вытягивание, который исправит проблему, так что посмотрим, куда это пойдет — с точки зрения производительности я отредактировал свой пост! - person Charlotte Skardon; 02.10.2013
comment
Это исправлено в версии 1.0.0.599 благодаря запросу на вытягивание от @ChrisSkardon. - person Tatham Oddie; 04.10.2013