Neo4j节点和关系结构

时间:2014-10-01 13:40:03

标签: database-design neo4j graph-databases

在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'
      }      
    ] 

编辑2:

澄清一下:这是我使用的数据结构(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;,我想将它们分解成单独的节点。该数据库中将有数百万人。

编辑3

我想的可能是将位置添加为节点,并使用&#34; name&#34;然后还在人与公司之间的关系上添加职位名称。这将使查询工作历史变得容易,但每个WORKED_AT关系(WORKED_AT.position属性)将占用额外的空间。通过这种结构,我也可以对位置节点进行搜索,并获得与某个位置相关的所有人。

对于这种简单的结构,这可能是好的,但那么更多&#34;嵌套&#34;值?就像人住在位于国家等州的城市一样?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我认为这样做的“正确”方式是对您的数据和应用程序感觉最自然的方式。就绩效而言,遍历两个关系而不是一个找到公司将不会产生任何额外影响,除非这么多公司共享一个职位,以确定哪个与该用户相关联的强烈逻辑。

但决定因素应该是您是否拥有个人与公司关系所特有的数据。我想到的第一件事是hired_on属性,用于跟踪一个人在那里呆多久。你可能希望独立于这个人的位置 - 我会在人和位置之间放置started_on财产 - 但你不想要一个人的工作历史吗?工资,电话分机,办公室电话等等......他们都可以参与这种关系。您不会将它们置于HAS_TITLE关系中,因为如果标题发生更改,您将丢失它们。它们也可能是person上的属性,但人们不能为多家公司工作?