如何在图形数据库中对客户调查进行建模?
How do I model a customer surveys in a graph database?
我们公司有很多基于调查的客户数据。例如,我们可能知道某人喜欢某项运动、电视节目、某支乐队、怀孕并且处于某个年龄段。营销人员将添加和删除要跟踪的标准。图数据库提供了多种建模选项,例如我们可以做一些像对象建模这样的事情
Customer.survey_question1.question = "What tv show do you like"
Customer.survey_question1.answer = "Sesame street"
在这里,我们将给客户一个 属性 并参考调查问题 1,其中将包含调查属性。每次营销人员添加问题和答案时,我们都必须更新客户模式。
我们也可以这样建模
Customer.surveys = [list of references to other objects]
其中 surveys 是对他们已回答的调查对象的引用列表。
在 graphdb 中添加非常稀疏的客户属性列表的惯用方法是什么
根据我的经验(使用 neo4j 大约 1 年)。图数据库作为数据存储的最大优势是从现有数据中生成复杂的洞察力(其中 sql 连接 table 的数据库性能较弱)。
因此,将从调查中检索到的所有数据存储在 Customer 节点或 (:Customer)-[:ANSWERS]->(:Servey) 中,neo4j 数据库不会给您带来任何好处。但是你得到了一些 "dark sides" 的 neo4j:) 我并不是说 neo4j 不好,但现在它不像 sql 那样完美。因此,为了获得 neo4j 的优势,如果有意义的话,我会尝试将每个用户答案存储为单独的实体。创建像 :Sport, :TvShow 这样的节点。但是我想将年龄存储在 :Customer 作为他的出生日期。或者,如果您打算在其他情况下也使用它,则可以生成日历树。因此,您可以将出生日期存储为与日历树的特定节点的关系(:日或:月或年 e.t.c)。
我会使用像这样的模型
(c:Customer)-[r1:ANSWERS]->(s:Servey), (c)-[r2:WATCHES]->(tv:TvShow), (s)-[:SERVEY_REPLY]->(tv)
。因此,每当客户改变主意并停止观看节目 s 时,我都会删除关系 r1,但我不会丢失存储它的数据 r2。您可以将此模型关系添加到 :Calendar 和许多不同的员工,但请确保您需要它)。
P.S。据我所知,有一些高薪人士对数据库建模:)如果你不确定,我的建议是,你从图形数据库中获益,而不是在生产中使用它:)
[编辑]
这是为您的用例建模的惯用方法。
您可以为每个调查问题使用一个节点,并为所有这些节点赋予相同的标签,比如 SurveyQuestion
。例如:
(sq:SurveyQuestion {id: 222, question: "What tv show do you like?"})
每个回答 SurveyQuestion
的客户都可以与该问题的节点建立特定类型的关系(例如,ANSWERED
),并且该关系可以包含此人的答案。例如:
(:Customer {id:123})-[:ANSWERED {answer: "The Voice"}]->(sq)
使用这种方法,无论何时添加新的调查问题,都无需更新 Customer
节点。只需在客户实际回答问题时创建 ANSWERED
关系。
获取所有调查问题:
MATCH (sq:SurveyQuestion)
RETURN sq;
要获得给出每个问题答案的客户(区分大小写,因此您可能希望在将所有答案存储在 ANSWERED
关系中之前使用 LOWER 将所有答案小写:
MATCH (sq:SurveyQuestion {id: 222})<-[a:ANSWERED]-(c:Customer)
RETURN sq, a.answer AS answer, COLLECT(c);
获取客户回答的所有问题,并his/her回答每个问题:
MATCH (sq:SurveyQuestion)<-[a:ANSWERED]-(c:Customer {id: 123})
RETURN c, a.answer AS answer, sq;
我们公司有很多基于调查的客户数据。例如,我们可能知道某人喜欢某项运动、电视节目、某支乐队、怀孕并且处于某个年龄段。营销人员将添加和删除要跟踪的标准。图数据库提供了多种建模选项,例如我们可以做一些像对象建模这样的事情
Customer.survey_question1.question = "What tv show do you like"
Customer.survey_question1.answer = "Sesame street"
在这里,我们将给客户一个 属性 并参考调查问题 1,其中将包含调查属性。每次营销人员添加问题和答案时,我们都必须更新客户模式。
我们也可以这样建模
Customer.surveys = [list of references to other objects]
其中 surveys 是对他们已回答的调查对象的引用列表。
在 graphdb 中添加非常稀疏的客户属性列表的惯用方法是什么
根据我的经验(使用 neo4j 大约 1 年)。图数据库作为数据存储的最大优势是从现有数据中生成复杂的洞察力(其中 sql 连接 table 的数据库性能较弱)。 因此,将从调查中检索到的所有数据存储在 Customer 节点或 (:Customer)-[:ANSWERS]->(:Servey) 中,neo4j 数据库不会给您带来任何好处。但是你得到了一些 "dark sides" 的 neo4j:) 我并不是说 neo4j 不好,但现在它不像 sql 那样完美。因此,为了获得 neo4j 的优势,如果有意义的话,我会尝试将每个用户答案存储为单独的实体。创建像 :Sport, :TvShow 这样的节点。但是我想将年龄存储在 :Customer 作为他的出生日期。或者,如果您打算在其他情况下也使用它,则可以生成日历树。因此,您可以将出生日期存储为与日历树的特定节点的关系(:日或:月或年 e.t.c)。
我会使用像这样的模型
(c:Customer)-[r1:ANSWERS]->(s:Servey), (c)-[r2:WATCHES]->(tv:TvShow), (s)-[:SERVEY_REPLY]->(tv)
。因此,每当客户改变主意并停止观看节目 s 时,我都会删除关系 r1,但我不会丢失存储它的数据 r2。您可以将此模型关系添加到 :Calendar 和许多不同的员工,但请确保您需要它)。
P.S。据我所知,有一些高薪人士对数据库建模:)如果你不确定,我的建议是,你从图形数据库中获益,而不是在生产中使用它:)
[编辑]
这是为您的用例建模的惯用方法。
您可以为每个调查问题使用一个节点,并为所有这些节点赋予相同的标签,比如 SurveyQuestion
。例如:
(sq:SurveyQuestion {id: 222, question: "What tv show do you like?"})
每个回答 SurveyQuestion
的客户都可以与该问题的节点建立特定类型的关系(例如,ANSWERED
),并且该关系可以包含此人的答案。例如:
(:Customer {id:123})-[:ANSWERED {answer: "The Voice"}]->(sq)
使用这种方法,无论何时添加新的调查问题,都无需更新 Customer
节点。只需在客户实际回答问题时创建 ANSWERED
关系。
获取所有调查问题:
MATCH (sq:SurveyQuestion)
RETURN sq;
要获得给出每个问题答案的客户(区分大小写,因此您可能希望在将所有答案存储在 ANSWERED
关系中之前使用 LOWER 将所有答案小写:
MATCH (sq:SurveyQuestion {id: 222})<-[a:ANSWERED]-(c:Customer)
RETURN sq, a.answer AS answer, COLLECT(c);
获取客户回答的所有问题,并his/her回答每个问题:
MATCH (sq:SurveyQuestion)<-[a:ANSWERED]-(c:Customer {id: 123})
RETURN c, a.answer AS answer, sq;