比较美国两代人的饮食习惯
比较美国两代人的饮食习惯
Alicia Powers <apowers411@gmail.com>
推特:@apowers411
作为Neo4j的入门介绍,我使用了来自美国疾病控制与预防中心国家健康和营养检查调查的开源数据来研究美国人的饮食习惯。我在推特上看到下面的图表后,受到了启发去研究这个问题。该图表显示,近年来,许多国家的肥胖率都在上升。我想知道肥胖率的上升是否是由年轻人较差的饮食习惯和较高的BMI导致的,或者老年人是否也出现了BMI和不良饮食习惯的增加。了解不同代际之间差异的一种方法是观察不同年龄段的人们的饮食方式。

使用可用的数据,我创建了下面概述的模型。每个人都由一个节点表示。节点上的标签是该人的年龄(岁)。此示例仅包含14至22岁和65岁以上的人,以便我能够观察两代人。每个人的节点上还包含其他人口统计信息(例如性别、BMI和体重(磅))。调查跟踪了人们两天内的饮食情况。
每个人的节点都通过“has_event”关系连接到至少一个饮食事件节点。这些饮食事件节点表示零食、正餐和饮料等。饮食事件具有时间和日期等属性。“has_event”关系具有事件是在家还是在外发生的属性。
事件(即正餐)通过“consume”关系链接到食物节点。“consume”关系的属性详细说明了该人食用了多少食物及其营养信息。最后,每种食物都使用“belong_to”关系连接到一个食物组。

此查询设置了约束并导入人员级别的信息。节点标签是每个人的年龄。此图片段仅导入了19个人。数据还包括每个人的BMI。BMI低于25为正常。BMI在25到29.9之间被认为超重,BMI超过30则为肥胖。
CREATE CONSTRAINT ON (c:Person) ASSERT c.id is UNIQUE;
CREATE CONSTRAINT ON (e:Events) ASSERT e.id is UNIQUE;
CREATE CONSTRAINT ON (f:Food) ASSERT f.id is UNIQUE;
CREATE CONSTRAINT ON (fg:Food) ASSERT fg.foodgroup is UNIQUE;
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/drpowpow/GraphGist/master/peoplegist.csv" AS line
CREATE (person:Person {id: line.id, ageyears: toFloat(line.ageyears), female: toInt(line.female),bmi:toFloat(line.bmi), weightlbs:toFloat(line.weightlbs)})
RETURN person
现在,其他食物、事件和食物组节点被添加到人员节点中。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/drpowpow/GraphGist/master/eventswithfoodgist.csv" AS line
MERGE (event:Events {id: line.mealid,name:line.eventname, dayofweek: line.dayofweek, eventtime:toFloat(line.eventtime)})
MERGE (food:Food {id:line.foodid, name:line.name})
MERGE (foodgroup:FoodGroup {foodgroup:line.FoodGroup})
本节添加了事件。该图可读。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/drpowpow/GraphGist/master/eventswithfoodgist.csv" AS line
MATCH (person:Person {id:line.personid}),(event:Events {id:line.mealid})
MERGE (person)-[:has_event {athome:line.eathome}]->(event);
本节添加了食物。该图变得更加复杂。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/drpowpow/GraphGist/master/eventswithfoodgist.csv" AS line
MATCH (event:Events {id:line.mealid}),(food:Food {id:line.foodid})
MERGE (event)-[:consumes {fat:line.fat,sugar:line.sugar,protein:line.protein,fiber:line.fiber,amount:line.amount,calories:line.calories,foodsource:line.foodsource}]->(food)
本节添加了食物组。该图变得难以阅读。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/drpowpow/GraphGist/master/eventswithfoodgist.csv" AS line
MATCH (food:Food {id:line.foodid}),(foodgroup:FoodGroup {foodgroup:line.FoodGroup})
MERGE (food)-[:belongs_to]->(foodgroup)
完整的图在此处。
现在,我使用查询来探索数据。请记住,这不是科学分析。这些查询旨在理解数据,以便我们可以在查询整个图时提出详细且有意义的问题。首先,我查看了两个人的图表,一个年长一个年轻。
这是老年人
您可以看到这个人喝了很多水,很少吃零食,并且似乎不喜欢蔬菜。你能猜出他们的BMI吗?(提示:它在上面的表格中)
MATCH (me:Person)-[:has_event]-(meal)-[:consumes]->(food)-[:belongs_to]->(fg)
WHERE me.ageyears=75
RETURN me,meal,food,fg
limit 50
这是年轻人
这个人经常吃各种各样的食物,尤其是在早餐时间。这个人喝了很多水,并且吃了大部分食物组。你能猜出他们的BMI吗?(提示:它在上面的表格中)
MATCH (me:Person)-[:has_event]-(meal)-[:consumes]->(food)-[:belongs_to]->(fg)
WHERE me.ageyears=18
RETURN me,meal,food,fg
limit 50
让我们看看人们的食物来自哪里。年轻人往往更频繁地在餐厅、食品卡车和自动售货机用餐。我个人感到惊讶的是,只有老年人才吃自己种植或捕获的食物。
MATCH (p:Person)-[v:has_event]->(e:Events)-[r:consumes]->(f:Food)
WITH r.foodsource as Foodsource, count(*) as Total,avg(p.ageyears) as Average_Age, avg(p.bmi) as Average_BMI
Return Foodsource, Total, Average_Age, Average_BMI
ORDER BY Foodsource,Total DESC
让我们看看平均而言,谁在吃什么食物组。食物组的定义较为宽泛。我知道酒精不是食物组,但它是对数据进行分类的一种简单方法。老年人似乎比年轻人喝得多。此外,老年人主要使用代糖。年轻人几乎只喝运动饮料,以及鱼类和海鲜。我确信其中一些发现是由于查询了图的一部分,但这里有一些趋势可能在查询完整图时也会出现。
MATCH (n:FoodGroup)-[:belongs_to]-(f)-[]-()-[]-(p)
RETURN n, count(f) as Foods,avg(p.ageyears) as Average_Age ,avg(p.bmi) as Average_BMI
LIMIT 25
让我们看看平均而言,谁在吃什么食物。这是一个很长的表格,但它提供了很多信息。我在这里放置了一个collect,以便我可以看到每个年龄段有多少人在吃特定的食物。BMI仅供参考。
MATCH (p:Person)-[v:has_event]->(e:Events)-[r:consumes]->(f:Food)
WITH f.name as Foods, count(*) as Total,collect(p.ageyears) as Ages,collect(p.bmi) as BMI
Return Foods, Total, Ages,BMI
ORDER BY Foods,Total DESC
此页面是否有帮助?