MongoDB 到 neo4j - 建模
MongoDB to neo4j - modelling
我必须将此 mongoDB 文档转换为 neo4j。
这是文档的示例:
{
"_id" : "Atl.02",
"official_name" : "Club Atletico de Madrid S.A.D.",
"common_name" : "Atletico Madrid",
"country" : "Spain",
"started_by" : {
"day" : 26,
"month" : 4,
"year" : 1903
},
"stadium" : {
"name" : "Vicente Calderón",
"capacity" : 54907
},
"palmarès" : {
"La Liga" : 10,
"Segunda Division" : 1,
"Copa del Rey" : 10,
"Supercopa de Espana" : 2,
"UEFA Europa League" : 2,
"UEFA Cup Winners Cup" : 1,
"UEFA Super Cup" : 2,
"FIFA Club World cup" : 1
},
"uniform" : "blue, white and red"
}
我创建团队节点:
CREATE (n:team {_id:"Atl.02", official_name:"Club Atletico de Madrid S.A.D.",
common_name:"Atletico Madrid", country:"Spain",
started_by_day: 26, started_by_month:4, started_by_year:1903,
uniform:"blue, white and red"})
体育场节点:
CREATE (n:stadium {name:"Vicente Calderòn", capacity:54907})
球队与球场的关系:
MATCH (n:team), (n1:stadium) WHERE n._id="Atl.02" AND
n1.name="Vicente Calderòn" CREATE n-[r:PLAYS]->n1
这是一张图片:
第一件事是:
如何转换palmarès的信息?
我想到了两种可能:
1) 将此信息放入团队节点
2) 创建一个新节点,称为 palmarès,并设置关系的属性
你怎么看?
关于 started by 信息呢?放到team node是不是一个不错的选择?
我建议您将各个奖项表示为单独的节点,因为同一个奖项可以由不同年份的多个团队赢得。此外,对特定奖品的查询将更容易编写并且 运行 更快。
例如:
(team:team {_id:"Atl.02"})-[:AWARDED {count: 10}]->(prize:Prize {name: "La Liga"})
我认为将 "started_by" 放在团队节点中很好,但您可能希望将 year/month/day 存储为单个整数(例如,纪元日期),以便更容易执行 Cypher涉及日期的查询。
或者,如果您没有方便的方法将 year/month/day 转换为整数,您可以将它们组合成一个 8 字符的字符串(按年月日顺序)。这是一个如何做到这一点的例子:
WITH 1993 AS year, 01 AS month, 16 AS day
RETURN
TOSTRING(year) +
(CASE WHEN month < 10 THEN "0" + month ELSE month END) +
(CASE WHEN day < 10 THEN "0" + day ELSE day END)
AS date;
结果 date
将是:“19930116”。
我必须将此 mongoDB 文档转换为 neo4j。 这是文档的示例:
{
"_id" : "Atl.02",
"official_name" : "Club Atletico de Madrid S.A.D.",
"common_name" : "Atletico Madrid",
"country" : "Spain",
"started_by" : {
"day" : 26,
"month" : 4,
"year" : 1903
},
"stadium" : {
"name" : "Vicente Calderón",
"capacity" : 54907
},
"palmarès" : {
"La Liga" : 10,
"Segunda Division" : 1,
"Copa del Rey" : 10,
"Supercopa de Espana" : 2,
"UEFA Europa League" : 2,
"UEFA Cup Winners Cup" : 1,
"UEFA Super Cup" : 2,
"FIFA Club World cup" : 1
},
"uniform" : "blue, white and red"
}
我创建团队节点:
CREATE (n:team {_id:"Atl.02", official_name:"Club Atletico de Madrid S.A.D.",
common_name:"Atletico Madrid", country:"Spain",
started_by_day: 26, started_by_month:4, started_by_year:1903,
uniform:"blue, white and red"})
体育场节点:
CREATE (n:stadium {name:"Vicente Calderòn", capacity:54907})
球队与球场的关系:
MATCH (n:team), (n1:stadium) WHERE n._id="Atl.02" AND
n1.name="Vicente Calderòn" CREATE n-[r:PLAYS]->n1
这是一张图片:
第一件事是:
如何转换palmarès的信息?
我想到了两种可能:
1) 将此信息放入团队节点
2) 创建一个新节点,称为 palmarès,并设置关系的属性
你怎么看?
关于 started by 信息呢?放到team node是不是一个不错的选择?
我建议您将各个奖项表示为单独的节点,因为同一个奖项可以由不同年份的多个团队赢得。此外,对特定奖品的查询将更容易编写并且 运行 更快。
例如:
(team:team {_id:"Atl.02"})-[:AWARDED {count: 10}]->(prize:Prize {name: "La Liga"})
我认为将 "started_by" 放在团队节点中很好,但您可能希望将 year/month/day 存储为单个整数(例如,纪元日期),以便更容易执行 Cypher涉及日期的查询。
或者,如果您没有方便的方法将 year/month/day 转换为整数,您可以将它们组合成一个 8 字符的字符串(按年月日顺序)。这是一个如何做到这一点的例子:
WITH 1993 AS year, 01 AS month, 16 AS day
RETURN
TOSTRING(year) +
(CASE WHEN month < 10 THEN "0" + month ELSE month END) +
(CASE WHEN day < 10 THEN "0" + day ELSE day END)
AS date;
结果 date
将是:“19930116”。