Cypher查询将相关节点作为子节点返回

时间:2013-02-14 19:29:31

标签: neo4j cypher

我正在使用Neo4j .NET客户端ExecuteGetCypherResults来运行密码。它希望所有内容都能在一个专栏中回归。我有一个简单的类JobType,其中包含JobSpecialties列表。在数据库中,这被建模为与专业有关系的类型。

enter image description here

我需要一个cypher查询,在单个列中返回结果。相关的Specialties应该是Type节点的子属性,我希望查询看起来像这样:

start s=node:node_auto_index(StartType='JobTypes')
match s-[:starts]->t, t-[:SubTypes]->ts
return {Id: t.Id, Name: t.Name, JobSpecialties: ts}

但这不起作用。如果这是可能的话,我无法从文档中找出答案。如果有更好的方法将结果返回给.Net客户端,我愿意接受建议。

3 个答案:

答案 0 :(得分:0)

start s=node:node_auto_index(StartType='JobTypes')
match s-[:SubTypes]->js
return s.Id, s.Name,  js;

答案 1 :(得分:0)

听起来.Net客户端需要对cypher进行一些更新。 Cypher不支持动态构建地图,尽管它已经在功能请求列表中了......

您可以使用结果创建一个数组(但从1.9.M04开始,它们必须是要合并到数组中的相同类型): http://console.neo4j.org/r/xo7voi

我实际上提交了一个拉取请求(通过反向通道,因为它打破了一些单元测试)来修复它(所以你可以在动态构建的阵列中有多种类型),但我认为是否存在一些问题合并不同类型是一个好主意。

https://github.com/wfreeman/neo4j/commit/ca457ace0df4732376833b8694e4affac4143244

更新:这将在1.9.M05 / 1.9.GA中修复。现在,您可以构建任何类型混合的数组: http://console.neo4j.org/r/vm4f83

答案 2 :(得分:0)

ExecuteGetCypherResults确实支持多列,您只需要将我们的反序列化器置于不同的模式。这是一个通常隐藏在我们更高级API背后的实现细节,这就是为什么这不明显。

当您致电new CypherQuery时,请传递CypherResultMode.Projection而不是CypherResultMode.Set

我实在记不起为什么会这样。有时候,我需要挖掘较低的水平并尝试杀死它。拉动请求欢迎。 :)

作为首选,我们总是希望人们使用更高级别的API(但我们认识到存在一些限制)。