搜索对象集合

时间:2013-11-17 09:06:10

标签: neo4j neo4jclient

我正在尝试搜索潜在节点的集合但无法执行此操作... 我有一个与许多实例有关系的产品。我想查询数据库并获取我从用户那里获得的列表中的所有实例。

的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;
}

尝试运行此密码时出现异常... 有没有更好的方法来搜索我从用户那里收集的多个项目?

1 个答案:

答案 0 :(得分: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'方法可能会出错:)

  3. 不使用索引的好处是 - 因为它们是遗留的 - 你为Neo4j 2.0设置得更好