我正在尝试搜索潜在节点的集合但无法执行此操作... 我有一个与许多实例有关系的产品。我想查询数据库并获取我从用户那里获得的列表中的所有实例。
的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;
}
尝试运行此密码时出现异常... 有没有更好的方法来搜索我从用户那里收集的多个项目?
答案 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注意事项
我们没有使用索引 - 使用它们没有任何好处,因为你有起点并且遍历'实例'对于Neo4j来说是一个简单的过程。
如果传入一个空列表,'CreateWhereClause'方法可能会出错:)
不使用索引的好处是 - 因为它们是遗留的 - 你为Neo4j 2.0设置得更好