在Neo4j中,我有一个人员节点,公司节点和一个位置节点。所以,一个人#34;有一个"位置"在一家"公司"。我有一个关于建模数据库以及这些节点之间关系的问题。
我可以像这样设置它(cypher"伪代码"):
(person)-[:WORKS_AT]-(company)
(person)-[:HAS_TITLE]->(position)
(company)-[:HAS_POSITION]->(position)
人有关系HAS_TITLE和WORKS_AT,或者像这样:
(person)-[:HAS_TITLE]->(position)<-[:HAS_POSITION]-(company)
如果人与公司之间没有直接关系,我将不得不通过职位节点找到公司。
我想这取决于我想要从数据库中获取的一点点,但是有一个&#34;正确/标准&#34;在图数据库中这样做的方法?
在数据库中搜索时,我想获得一个人的所有职位。我想将它们作为这样的集合返回:
[
{
company: 'some company',
position: 'some position at the company'
},
{
company: 'some other company',
position: '' // empty position, I dont have the position data here
} ,
{
company: 'some other company',
position: 'some position at the company'
}
]
澄清一下:这是我使用的数据结构(json)。这是仅限一个人的数据,有多个人可以在不同的公司中拥有相同的职位等。我需要将其放入Neo4j并使其可搜索:
{
"id": 123,
"name": "Foo Bar",
"email": "",
"workhistory": {
"positions": [
{
"company": "Company A",
"employees": "",
"type": "Privately Held",
"start": 1356998400,
"end": "",
"position": "Position A",
"description": "",
"industry": "some industry"
},
{
"company": "Company B",
"employees": "",
"type": "Privately Held",
"start": 1356998400,
"end": "",
"position": "Position B",
"description": "",
"industry": "some industry"
},
{
"company": "Company C",
"employees": "",
"type": "Privately Held",
"start": 1341100800,
"end": "",
"position": "Position A",
"description": "",
"industry": ""
}
]
}
}
我希望能够搜索&#34;位置&#34;节点名称&#34;名称&#34;名为&#34;位置A&#34;的财产,然后找到具有此职位的所有人,并返回他们的个人资料,其结构与放入数据库时相同,给予或接受。
同样适用于&#34;行业&#34;和&#34;公司&#34;,我想将它们分解成单独的节点。该数据库中将有数百万人。
我想的可能是将位置添加为节点,并使用&#34; name&#34;然后还在人与公司之间的关系上添加职位名称。这将使查询工作历史变得容易,但每个WORKED_AT关系(WORKED_AT.position属性)将占用额外的空间。通过这种结构,我也可以对位置节点进行搜索,并获得与某个位置相关的所有人。
对于这种简单的结构,这可能是好的,但那么更多&#34;嵌套&#34;值?就像人住在位于国家等州的城市一样?
答案 0 :(得分:1)
在这种情况下,我认为这样做的“正确”方式是对您的数据和应用程序感觉最自然的方式。就绩效而言,遍历两个关系而不是一个找到公司将不会产生任何额外影响,除非这么多公司共享一个职位,以确定哪个与该用户相关联的强烈逻辑。
但决定因素应该是您是否拥有个人与公司关系所特有的数据。我想到的第一件事是hired_on
属性,用于跟踪一个人在那里呆多久。你可能希望独立于这个人的位置 - 我会在人和位置之间放置started_on
财产 - 但你不想要一个人的工作历史吗?工资,电话分机,办公室电话等等......他们都可以参与这种关系。您不会将它们置于HAS_TITLE
关系中,因为如果标题发生更改,您将丢失它们。它们也可能是person
上的属性,但人们不能为多家公司工作?