Neo4j 中涉及 3 个节点和 1 个关系的领域设计
Domain design involving 3 NODES and 1 RELATIONSHIP in Neo4j
我需要在 neo4j 中为以下用例设计域
一个人可以拥有很多技能。 PERSON 可以在不同的组织中工作。每个组织都可以根据他们提出的每个技能对一个人进行排名。
现在 PersonA 有技能 SkillA 和 SkillB 。他从事需要 OrganizationA 中的 SkillA 的 TaskA 和需要 OrganizationB 中的 SkillA 的 TasKB。
如何在neo4j中设计上述案例
一般来说,这取决于您的查询。
我可以想象你的数据集结构的用法,那么我可能会选择这样的东西:
(p:Person), (o:Organization), (s:Skill), (t:Task)
(p)-[:WORK_AT]->(o)
(p)-[:WORK_ON]->(t)
(p)-[:HAVE]->(s)
(t)-[:REQUIRE]->(s)
(t)-[:BELONGS_TO]->(o)
这个呢?
(:Person), (:Organization), (:Skill), (:Ranking), (:Task)
(:Person)-[:works_at]->(:Organization)
(:Organization)-[:gives_ranking]->(:Ranking)
(:Ranking)-[:ranks_person {rank: value}]->(:Person)
(:Ranking)-[:for_skill]->(:Skill)
(:Person)-[:works_on]->(:Task)
(:Task)-[:requires_skill]->(:Skill)
这完全取决于您的用例以及您希望从图中回答的问题。
举个例子,看看 Recruitment GraphGist http://gist.neo4j.org/?0278fc6cbba43c4bf964,它从招聘的角度对你的数据子集进行建模。
为了正确回答这个问题,您确实需要提供您要查询的类型。许多模型都是可能的,但只有其中一些可能适合以高效 and/or 优雅的方式进行查询。
这是一个示例模型,可能适合也可能不适合您的需要。它(根据您规定的要求)添加了一个节点,用于存储一个人自称拥有的每项技能的 "claimed skill level"。此节点允许多人为每种类型的技能共享一个 :Skill
节点,同时还为每个 person/skill 提供一个节点供组织的评级 (:RATES
) 关系指向。
(:Person)-[:CLAIMS]->(:ClaimedSkillLevel {level:95})-[:FOR]->(:Skill {name: "Java"})<-[:REQURES]-(:Task)<-[:HAS_TASK]-(:Organization)
(:ClaimedSkillLevel)<-[:RATES {rating:75}]-(:Organization)
(:Person)-[:WORKED_ON]->(:Task)
我需要在 neo4j 中为以下用例设计域
一个人可以拥有很多技能。 PERSON 可以在不同的组织中工作。每个组织都可以根据他们提出的每个技能对一个人进行排名。 现在 PersonA 有技能 SkillA 和 SkillB 。他从事需要 OrganizationA 中的 SkillA 的 TaskA 和需要 OrganizationB 中的 SkillA 的 TasKB。
如何在neo4j中设计上述案例
一般来说,这取决于您的查询。 我可以想象你的数据集结构的用法,那么我可能会选择这样的东西:
(p:Person), (o:Organization), (s:Skill), (t:Task)
(p)-[:WORK_AT]->(o)
(p)-[:WORK_ON]->(t)
(p)-[:HAVE]->(s)
(t)-[:REQUIRE]->(s)
(t)-[:BELONGS_TO]->(o)
这个呢?
(:Person), (:Organization), (:Skill), (:Ranking), (:Task)
(:Person)-[:works_at]->(:Organization)
(:Organization)-[:gives_ranking]->(:Ranking)
(:Ranking)-[:ranks_person {rank: value}]->(:Person)
(:Ranking)-[:for_skill]->(:Skill)
(:Person)-[:works_on]->(:Task)
(:Task)-[:requires_skill]->(:Skill)
这完全取决于您的用例以及您希望从图中回答的问题。
举个例子,看看 Recruitment GraphGist http://gist.neo4j.org/?0278fc6cbba43c4bf964,它从招聘的角度对你的数据子集进行建模。
为了正确回答这个问题,您确实需要提供您要查询的类型。许多模型都是可能的,但只有其中一些可能适合以高效 and/or 优雅的方式进行查询。
这是一个示例模型,可能适合也可能不适合您的需要。它(根据您规定的要求)添加了一个节点,用于存储一个人自称拥有的每项技能的 "claimed skill level"。此节点允许多人为每种类型的技能共享一个 :Skill
节点,同时还为每个 person/skill 提供一个节点供组织的评级 (:RATES
) 关系指向。
(:Person)-[:CLAIMS]->(:ClaimedSkillLevel {level:95})-[:FOR]->(:Skill {name: "Java"})<-[:REQURES]-(:Task)<-[:HAS_TASK]-(:Organization)
(:ClaimedSkillLevel)<-[:RATES {rating:75}]-(:Organization)
(:Person)-[:WORKED_ON]->(:Task)