2013-11-17 3 views
0

Я пытаюсь найти коллекцию потенциальных узлов, но не могу это сделать ... У меня есть продукт, который имеет отношения со многими экземплярами. Я хотел бы запросить БД и получить все экземпляры, которые находятся в списке, который я получаю от пользователя.Поиск коллекции объектов

Cypher:

var query = _context 
.Cypher 
.Start(new 
{ 
    instance = startBitsList, 
    product = productNode.Reference, 
}) 
.Match("(product)-[:HasInstanceRel]->(instance)") 
.Return(instance => instance.Node<ProductInstance>()); 

Проблема заключается в startBitsList ... Я использую StringBuilder для создания запроса, который содержит все экземпляры я ищу:

private static string CreateStartBits(IEnumerable<string> instanceNames) 
{ 
    var sb = new StringBuilder(); 
    sb.AppendFormat("node:'entity_Name_Index'("); 
    foreach (var id in productIds) 
    { 
    sb.AppendFormat("Name={0} OR ", id); 
    } 
    sb.Remove(sb.Length - 4, 4); 
    sb.Append(")"); 

    var startBitsList = sb.ToString(); 
    return startBitsList; 
} 

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

+0

Могут ли экземпляры быть независимыми от продуктов? То есть Можете ли вы иметь экземпляр «x», который не связан с продуктом, или может быть подключен экземпляр к нескольким продуктам? –

+0

Каждый экземпляр должен быть подключен только к одному продукту – Jaffi

+0

Вы пробовали запрос в neo4j - он работает, если вы делаете что-то вроде: 'START instance =/* multiple index look ups * /' ?? –

ответ

0

ОК, я думаю, что здесь есть пара проблем, сначала я предполагаю, что вы используете Neo4j 1.9, а не 2.0 - следовательно, используя .Start.

Вы пробовали взять ваш запрос и запустить его в Neo4j? Это должен быть ваш первый порт захода, как правило, легко добавить точку останова на вызов .Results и добавить «часы» для query.Query.DebugText.

Однако, я не думаю, что вам нужно использовать StartBits как вы, я думаю, вы бы лучше фильтрации с .Where, как у вас уже есть начальная точка:

private static ICypherFluentQuery CreateWhereClause(ICypherFluentQuery query, ICollection<string> instanceNames) 
{ 
    query = query.Where((Instance instance) => instance.Name == instanceNames.First()); 
    query = instanceNames.Skip(1).Aggregate(query, (current, localInstanceName) => current.OrWhere((Instance instance) => instance.Name == localInstanceName)); 
    return query; 
} 

и ваш запрос будет что-то вроде:

var prodReference = new NodeReference<Product>(2); 

var query = 
    Client.Cypher 
     .ParserVersion(1, 9) 
     .Start(new {product = prodReference}) 
     .Match("(product)-[:HasInstanceRel]->(instance)"); 

query = CreateWhereClause(query, new[] {"Inst2", "Inst1"}); 
var resultsQuery = query.Return(instance => instance.As<Node<Instance>>()); 

2 вещи примечания

  1. Мы не используем индексы - нет никакой пользы для их использования, поскольку у вас есть начальная точка, и переход к «экземплярам» - это простой процесс для Neo4j.

  2. Метод «CreateWhereClause», вероятно, пойдет не так, если вы передаете в пустом списке :)

Хорошая вещь о не использовании индексов является то, что - потому что они устарели - вы настроены лучше для Neo4j 2.0

Смежные вопросы