Database design Neo4j节点与关系结构

Database design Neo4j节点与关系结构,database-design,neo4j,graph-databases,Database Design,Neo4j,Graph Databases,在Neo4j中,我有一个人员节点、公司节点和职位节点。因此,“人”在“公司”有“职位”。我有一个关于数据库建模和这些节点之间关系的问题 我可以这样设置(密码“伪代码”): 有关系的人有头衔和工作地点,或类似于: (person)-[:HAS_TITLE]->(position)<-[:HAS_POSITION]-(company) 编辑2: 澄清一下:这是我开始使用的数据结构(json)。这是只针对一个人的数据,有多个人可以在不同的公司等拥有相同的职位。我需要将其放入Neo4j并使

在Neo4j中,我有一个人员节点、公司节点和职位节点。因此,“人”在“公司”有“职位”。我有一个关于数据库建模和这些节点之间关系的问题

我可以这样设置(密码“伪代码”):

有关系的人有头衔和工作地点,或类似于:

(person)-[:HAS_TITLE]->(position)<-[:HAS_POSITION]-(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": ""
           }
        ]
     }
  }
我希望能够搜索一个“位置”节点,该节点具有名为“位置a”的“名称”属性,然后找到所有具有此位置的人员,并返回他们的配置文件,其结构与将其放入数据库时相同,即“给予或接受”

“行业”和“公司”也是如此,我想把它们分割成单独的节点。该数据库将拥有数百万人

编辑3 我正在考虑将职位添加为一个节点,带有一个“name”属性等,然后在个人与公司之间的关系中添加职位名称。这将便于查询工作历史,但会为每个WORKED_AT关系(WORKED_AT.position属性)占用额外的空间。通过这种结构,我还可以在职位节点上进行搜索,并获取与某个职位相关的所有人员


对于这个简单的结构来说,这可能是可以的,但是更多的“嵌套”值呢?比如说,一个人住在城市,在国家,在农村,等等

在这种情况下,我认为“正确”的做法是让您的数据和应用程序感觉最自然的方式。就性能而言,遍历两个关系而不是一个关系来查找公司不会产生任何额外的影响,除非一个职位由如此多的公司共享,以至于有强烈的逻辑来确定哪一个与该用户相关


但决定因素应该是你是否拥有个人和公司关系所特有的数据。我想到的第一件事是在地产上雇佣一个
来跟踪一个人在那里呆了多长时间。您可能希望看到这一点,而不考虑人员的职位——我会在人员和职位之间的
属性上放置一个
started\u——但您不想要人员的工作历史吗?比如工资,电话分机,办公室号码。。。他们都可以在这种关系中占有一席之地。你不会把它们放在
HAS_TITLE
关系中,因为如果标题更改,你会失去它们。它们也可以是
个人的属性,但是人们不能为多个公司工作吗?

这在很大程度上取决于你想从数据库中得到什么。FWIW,你的设计在我看来完全合理。你能详细说明一下你的问题吗?若你们通过这个职位把个人和公司联系起来,那个看起来是可行的。你担心这个设计会让你做不到什么?我担心我可能会遇到一个没有职位数据的人,所以没有节点连接这个人和公司,即使他在那里工作,我也不知道他在那里做了什么。我需要将位置作为节点的原因是,我希望使用标签对其进行索引,并能够在其上进行搜索。我可以把这个职位作为个人和公司之间关系的财产,但是我无法在不影响业绩的情况下搜索它。如果你总是知道这个人所在的公司,那么即使你错过了他们的职位,你也可以通过:WORKS\u AT将他们联系起来。你也可以创建一个虚拟职位“未知”(每个公司一个),然后如果你知道这个人在X公司工作,但不知道他们的头衔,就把他链接到这个职位上。这样,即使你不知道价值应该是什么,这种联系也总是存在的。如果你不知道一个人为哪家公司工作,那么你可能就完蛋了。如果该信息不在您的数据集中,那么任何图形设计都不会有帮助,因为您只是不知道而已。:)我总是知道一个人为哪家公司工作,我想:)那么,如果有职位存在,就为他创作作品,如果没有职位存在,就不要为他创作作品,就只有这个头衔吗?编辑问题以显示我想从数据库中获取的内容。是的,我确实有关系的属性,如开始日期和结束日期。即使在人与职位、人与公司之间的关系上,它们也可能是相同的。一个人可以为同一家或不同的公司担任多个职位,包括当前和过去的职位。一个职位可能会有很多公司与之相关。在执行查询时,我通常首先匹配person节点。
    [
      { 
        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'
      }      
    ] 
  {   
     "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": ""
           }
        ]
     }
  }