我在Neo4J中有一组家族树的数据,我正在尝试构建一个Cypher查询,该查询生成类似于以下内容的JSON数据集:
{Name: "Bob",
parents: [
{Name: "Roger",
parents: [
Name: "Robert",
Name: "Jessica"
]},
{Name: "Susan",
parents: [
Name: "George",
Name: "Susan"
]}
]}
Run Code Online (Sandbox Code Playgroud)
我的图在MEMBER节点之间具有PARENT关系(即MATCH(p.Member) - [:PARENT] - >(c.Member)).我在cypher和neo4j cypher嵌套收集中发现了嵌套的has_many关系,最终将所有父节点组合在一起,用于我正在搜索的主子节点.
根据反馈添加一些清晰度:
每个成员都有唯一的标识符.工会目前都与父母关系有关.所有内容都被编入索引,以便性能不会受到影响.当我运行查询以返回节点图时,我得到了我期望的结果.我正在尝试返回一个输出,我可以将其用于D3的可视化目的.理想情况下,这将通过Cypher查询完成,因为我正在使用API从正在构建的前端访问neo4j.
添加示例查询:
MATCH (p:Person)-[:PARENT*1..5]->(c:Person)
WHERE c.FirstName = 'Bob'
RETURN p.FirstName, c.FirstName
Run Code Online (Sandbox Code Playgroud)
此查询返回五代的每个父级列表,但不是显示层次结构,而是将"Bob"列为每个关系的子级.是否有Cypher查询至少会显示数据中的每个关系?我可以根据需要格式化它...
家谱数据可能符合 GEDCOM 标准并包括两种类型的节点:Person 和 Union。Person 节点有它的标识符和通常的人口统计信息。联合节点有一个 union_id 和关于联合的事实。在 GEDCOM 中,家庭是将这两者结合在一起的第三个元素。但是在 Neo4j 中,我发现在 Person 节点中包含 union_id 也很合适。我使用了 5 种关系:父亲、母亲、丈夫、妻子和孩子。家庭是两个具有内向向量的父母,每个孩子都有一个外向向量。图像说明了这一点。这对于可视化连接和生成假设非常方便。例如,考虑附加的图片和我的祖先 Edward G Campbell,1917 年工会的产物,其中三个兄弟与来自工会 8944 的三个沃特姐妹结婚,两个与来自工会 2945 的盖瑟姐妹结婚。此外,在左上角,玛哈拉·坎贝尔如何与她的继兄弟约翰·格里尔·阿姆斯特朗结婚。Mahala 旁边是 Elizabeth Campbell,她与其他 Campbell 有婚姻关系,但很可能与他们有直接关系。同样,您可以假设右上角的 Rachael Jacobs 以及她与其他 Jacobs 的关系。
我使用批量插入,它可以在一分钟内填充 ~30000 Person 节点和 ~100,000 关系。我有一个小的 .NET 函数,它从数据视图返回 JSon;这个通用解决方案适用于任何数据视图,因此它是可扩展的。我现在正在努力添加其他数据,例如位置(纬度/经度)、文档(特别是链接人员,例如人口普查)等。
您可以查看Rik van Bruggens博客的家庭数据:
关于你的查询
你已经在这里创建的路径模式:(p:Person)-[:PARENT*1..5]->(c:Person)你可以将它分配给一个变量tree,然后该变量,如操作返回树,或nodes(tree)或rels(tree)或以其他方式该集合操作:
MATCH tree = (p:Person)-[:PARENT*1..5]->(c:Person)
WHERE c.FirstName = 'Bob'
RETURN nodes(tree), rels(tree), tree, length(tree),
[n in nodes(tree) | n.FirstName] as names
Run Code Online (Sandbox Code Playgroud)
另请参阅cypher参考卡:http://neo4j.com/docs/stable/cypher-refcard和在线培训http://neo4j.com/online-training以了解有关Cypher的更多信息.
别忘了
create index on :Person(FirstName);
Run Code Online (Sandbox Code Playgroud)