如何在neo4j中存储节点组?

时间:2016-04-17 17:18:22

标签: neo4j cypher

我们正在制作艺术家/音乐/电影及其相互关联的图表。

我们发现可能有两种类型的数据关系组,Simple和Compound。

1)简单数据示例

(Bob Marley)-[music:composer:compositions]->(Natural Mystic)

2)化合物数据示例

(Bob Marley)-[award:award_nominee:award_nominations]->(*MANY*) 

award:award_nomination:award->Grammy Award for Best Music Film
award:award_nomination:ceremony->44th Annual Grammy Awards
award:award_nomination:nominated_for->Rebel Music - The Bob Marley Story
award:award_nomination:year->2001

award:award_nomination:award->Grammy Award for Best Music Film
award:award_nomination:ceremony->45th Annual Grammy Awards
award:award_nomination:nominated_for->Rebel Music - The Bob Marley Story II
award:award_nomination:year->2002

还有更多像那样的

我尝试了各种方法来排序

  1. 完整的层次结构等,但流程图太乱了 我无法确定哪个奖项对应于哪一年 示例
  2. 创建一个名为" nominations"的新节点并将名称值对存储到它,但在这种情况下,如何将信息存储到类似的节点 (格莱美) - [某种关系] - > Bob marley?再次将其存储为节点?这将是重复数据。
  3. 将整个3层层次结构存储为关系。因为neo4j不允许3种关系而失败
  4. neo4j Linked lists,但这会有帮助吗?
  5. 是正确的做法
  6. Neo4j参考卡说它允许节点的嵌套属性,但这似乎是一个骗局。我尝试了查询,FAIL

    {姓名:" Alice",年龄:38岁,  地址:{city:' London',住宅:true}} 文字地图用花括号声明,就像属性地图一样。支持嵌套地图和集合。

1 个答案:

答案 0 :(得分:1)

我看到传统的RDB分层思维 - 你需要改变它。图形允许您展平层次结构,并在相关节点之间建立相关信息组的直接关联。

我已经创建了一组节点和关系,我认为它们将为您提供您正在寻找的结构,并且可以扩展到您的其他场景。将以下命令插入neo4j数据库,看看你的想法:

// Create the nodes of the graph
CREATE (award:Award {name: "Grammy Award for Best Music Film"})
CREATE (date:AwardDate {year: 2001})

CREATE (film:Film {name: "Rebel Music - The Bob Marley Story"})
CREATE (event:Event {name: "44th Annual Grammy Awards", year: date.year})
CREATE (composition:Composition {name: "Natural Mystic"})
CREATE (composer:Composer {name: "Bob Marley"})

// Create the relationships between the graph nodes
MERGE (composer)-[:COMPOSITION]->(composition)
MERGE (composition)-[:SOUNDTRACK]->(film)

MERGE (event)-[:AWARD]->(award)
MERGE (event)-[:DATE]->(date)
MERGE (film)-[:DATE]->(date)
MERGE (composer)-[:DATE]->(date)
MERGE (composition)-[:DATE]->(date)

MERGE (film)-[:NOMINATED {year: date.year}]->(award)
MERGE (composer)-[:NOMINATED {year: date.year}]->(award)
MERGE (composition)-[:NOMINATED {year: date.year}]->(award)

MERGE (film)-[:EVENT]->(event)
MERGE (composer)-[:EVENT]->(event)
MERGE (composition)-[:EVENT]->(event)

此外,对于任何体面大小的节点集合,您都需要这些标签上的索引。