代码之家  ›  专栏  ›  技术社区  ›  Kunal Mukherjee

Neo4J关系建模问题

  •  0
  • Kunal Mukherjee  · 技术社区  · 7 年前

    我试图根据以下层次结构对城市间和城市内部的关系进行建模:

    domestic travel/
    ├── intra-city/
    │   ├── bangalore
    │   ├── pune
    │   ├── hyderabad
    │   ├── delhi
    │   ├── mumbai
    │   ├── kolkata
    │   └── chennai
    ├── inter-city/
    │   ├── bangalore -> pune
    │   └── bangalore -> hyderabad
    │   └── bangalore -> chennai
    │   └── bangalore -> delhi
    │   └── bangalore -> mumbai
    │   └── bangalore -> kolkata
    │   └── hyderabad -> bangalore
    │   └── hyderabad -> pune
    │   └── hyderabad -> chennai
    │   └── hyderabad -> delhi
    │   └── hyderabad -> mumbai
    │   └── hyderabad -> kolkata
    

    国内旅行是我的根节点,可以是子节点

    • 市内(在同一城市内旅行)
    • 城际(往返两地) (不同城市)

    我还有一个cities根节点,其中包含所有附加到它的城市。


    目前,我将其建模为有两个关系 (:FROM_CITY和:TO_CITY) :

    如果旅行类型是内城,那么我直接标记 :TO_CITY 与城市的关系,如果是城际关系,我将以第一个城市为标志 :FROM_CITY .下面的屏幕截图显示了这一点。

    enter image description here


    下面是我用来建立关系模型的密码查询。

    1) 旅行树:

    MERGE (Travel: TravelType { name: 'Travel' })
    ON CREATE SET
        Travel.id = randomUUID(),
        Travel.type = 'TravelType',
        Travel.created = timestamp()
    ON MATCH SET
        Travel.lastUpdated = timestamp()
    
    MERGE (InternationTravel:TravelType { name: 'InternationTravel' })
    ON CREATE SET
        InternationTravel.id = randomUUID(),
        InternationTravel.type = 'TravelType',
        InternationTravel.subtype = 'Internation Travel',
        InternationTravel.created = timestamp()
    ON MATCH SET
        InternationTravel.lastUpdated = timestamp()
    
    MERGE (DomesticTravel:TravelType { name: 'DomesticTravel' })
    ON CREATE SET
        DomesticTravel.id = randomUUID(),
        DomesticTravel.type = 'TravelType',
        DomesticTravel.subtype = 'Domestic Travel',
        DomesticTravel.created = timestamp()
    ON MATCH SET
        DomesticTravel.lastUpdated = timestamp()
    
    MERGE (IntraCity: TravelType { name: 'IntraCity' })
    ON CREATE SET
        IntraCity.id = randomUUID(),
        IntraCity.type = 'Domestic Travel',
        IntraCity.created = timestamp()
    ON MATCH SET
        IntraCity.lastUpdated = timestamp()
    
    MERGE (InterCity: TravelType { name: 'InterCity' })
    ON CREATE SET
        InterCity.id = randomUUID(),
        InterCity.type = 'Domestic Travel',
        InterCity.created = timestamp()
    ON MATCH SET
        InterCity.lastUpdated = timestamp()
    
    MERGE (Travel)-[:OF_TYPE_TRAVEL]->(DomesticTravel)
    MERGE (Travel)-[:OF_TYPE_TRAVEL]->(InternationTravel)
    
    MERGE (DomesticTravel)-[:OF_TYPE_DOMESTIC_TRAVEL]->(IntraCity)
    MERGE (DomesticTravel)-[:OF_TYPE_DOMESTIC_TRAVEL]->(InterCity)
    RETURN *
    

    2) 城市树:

    MERGE (City: Location { name: 'City' })
    ON CREATE SET
        City.id = randomUUID(),
        City.type = 'Location',
        City.created = timestamp()
    ON MATCH SET
        City.lastUpdated = timestamp()
    
    MERGE (Bangalore:Location { name: 'Bangalore' })
    ON CREATE SET
        Bangalore.id = randomUUID(),
        Bangalore.type = 'Location',
        Bangalore.created = timestamp(),
        Bangalore.IATACode = 'BLR',
        Bangalore.CityType = 1
    ON MATCH SET
        Bangalore.lastUpdated = timestamp()
    
    MERGE (Chennai:Location { name: 'Chennai' })
    ON CREATE SET
        Chennai.id = randomUUID(),
        Chennai.type = 'Location',
        Chennai.created = timestamp(),
        Chennai.IATACode = 'MAA',
        Chennai.CityType = 1
    ON MATCH SET
        Chennai.lastUpdated = timestamp()
    
    MERGE (Hyderabad:Location { name: 'Hyderabad' })
    ON CREATE SET
        Hyderabad.id = randomUUID(),
        Hyderabad.type = 'Location',
        Hyderabad.created = timestamp(),
        Hyderabad.IATACode = 'HYD',
        Hyderabad.CityType = 1
    ON MATCH SET
        Hyderabad.lastUpdated = timestamp()
    
    MERGE (Pune:Location { name: 'Pune' })
    ON CREATE SET
        Pune.id = randomUUID(),
        Pune.type = 'Location',
        Pune.created = timestamp(),
        Pune.IATACode = 'PNQ',
        Pune.CityType = 1
    ON MATCH SET
        Pune.lastUpdated = timestamp()
    
    MERGE (DelhiNCR:Location { name: 'DelhiNCR' })
    ON CREATE SET
        DelhiNCR.id = randomUUID(),
        DelhiNCR.type = 'Location',
        DelhiNCR.created = timestamp(),
        DelhiNCR.IATACode = 'DEL',
        DelhiNCR.CityType = 2
    ON MATCH SET
        DelhiNCR.lastUpdated = timestamp()
    
    MERGE (Mumbai:Location { name: 'Mumbai' })
    ON CREATE SET
        Mumbai.id = randomUUID(),
        Mumbai.type = 'Location',
        Mumbai.created = timestamp(),
        Mumbai.IATACode = 'BOM',
        Mumbai.CityType = 2
    ON MATCH SET
        Mumbai.lastUpdated = timestamp()
    
    MERGE (Kolkata:Location { name: 'Kolkata' })
    ON CREATE SET
        Kolkata.id = randomUUID(),
        Kolkata.type = 'Location',
        Kolkata.created = timestamp(),
        Kolkata.IATACode = 'CCU',
        Kolkata.CityType = 2
    ON MATCH SET
        Kolkata.lastUpdated = timestamp()
    
    MERGE (`Other Cities`:Location { name: 'Other Cities' })
    ON CREATE SET
        `Other Cities`.id = randomUUID(),
        `Other Cities`.type = 'Location',
        `Other Cities`.created = timestamp(),
        `Other Cities`.IATACode = [],
        `Other Cities`.CityType = 3
    ON MATCH SET
        `Other Cities`.lastUpdated = timestamp()
    
    MERGE (City)-[:OF_TYPE_CITY]->(Bangalore)
    MERGE (City)-[:OF_TYPE_CITY]->(Hyderabad)
    MERGE (City)-[:OF_TYPE_CITY]->(Pune)
    MERGE (City)-[:OF_TYPE_CITY]->(Chennai)
    
    MERGE (City)-[:OF_TYPE_CITY]->(DelhiNCR)
    MERGE (City)-[:OF_TYPE_CITY]->(Mumbai)
    MERGE (City)-[:OF_TYPE_CITY]->(Kolkata)
    
    MERGE (City)-[:OF_TYPE_CITY]->(`Other Cities`)
    
    MERGE (Bangalore)-[:TO_CITY]->(Hyderabad)
    MERGE (Bangalore)-[:TO_CITY]->(Pune)
    MERGE (Bangalore)-[:TO_CITY]->(Chennai)
    MERGE (Bangalore)-[:TO_CITY]->(DelhiNCR)
    MERGE (Bangalore)-[:TO_CITY]->(Mumbai)
    MERGE (Bangalore)-[:TO_CITY]->(Kolkata)
    MERGE (Bangalore)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (Hyderabad)-[:TO_CITY]->(Bangalore)
    MERGE (Hyderabad)-[:TO_CITY]->(Pune)
    MERGE (Hyderabad)-[:TO_CITY]->(Chennai)
    MERGE (Hyderabad)-[:TO_CITY]->(DelhiNCR)
    MERGE (Hyderabad)-[:TO_CITY]->(Mumbai)
    MERGE (Hyderabad)-[:TO_CITY]->(Kolkata)
    MERGE (Hyderabad)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (Pune)-[:TO_CITY]->(Bangalore)
    MERGE (Pune)-[:TO_CITY]->(Hyderabad)
    MERGE (Pune)-[:TO_CITY]->(Chennai)
    MERGE (Pune)-[:TO_CITY]->(DelhiNCR)
    MERGE (Pune)-[:TO_CITY]->(Mumbai)
    MERGE (Pune)-[:TO_CITY]->(Kolkata)
    MERGE (Pune)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (Chennai)-[:TO_CITY]->(Bangalore)
    MERGE (Chennai)-[:TO_CITY]->(Hyderabad)
    MERGE (Chennai)-[:TO_CITY]->(Pune)
    MERGE (Chennai)-[:TO_CITY]->(DelhiNCR)
    MERGE (Chennai)-[:TO_CITY]->(Mumbai)
    MERGE (Chennai)-[:TO_CITY]->(Kolkata)
    MERGE (Chennai)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (DelhiNCR)-[:TO_CITY]->(Bangalore)
    MERGE (DelhiNCR)-[:TO_CITY]->(Hyderabad)
    MERGE (DelhiNCR)-[:TO_CITY]->(Pune)
    MERGE (DelhiNCR)-[:TO_CITY]->(Chennai)
    MERGE (DelhiNCR)-[:TO_CITY]->(Mumbai)
    MERGE (DelhiNCR)-[:TO_CITY]->(Kolkata)
    MERGE (DelhiNCR)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (Mumbai)-[:TO_CITY]->(Bangalore)
    MERGE (Mumbai)-[:TO_CITY]->(Hyderabad)
    MERGE (Mumbai)-[:TO_CITY]->(Pune)
    MERGE (Mumbai)-[:TO_CITY]->(Chennai)
    MERGE (Mumbai)-[:TO_CITY]->(DelhiNCR)
    MERGE (Mumbai)-[:TO_CITY]->(Kolkata)
    MERGE (Mumbai)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (Kolkata)-[:TO_CITY]->(Bangalore)
    MERGE (Kolkata)-[:TO_CITY]->(Hyderabad)
    MERGE (Kolkata)-[:TO_CITY]->(Pune)
    MERGE (Kolkata)-[:TO_CITY]->(Chennai)
    MERGE (Kolkata)-[:TO_CITY]->(Mumbai)
    MERGE (Kolkata)-[:TO_CITY]->(DelhiNCR)
    MERGE (Kolkata)-[:TO_CITY]->(`Other Cities`)
    
    MERGE (`Other Cities`)-[:TO_CITY]->(Bangalore)
    MERGE (`Other Cities`)-[:TO_CITY]->(Hyderabad)
    MERGE (`Other Cities`)-[:TO_CITY]->(Pune)
    MERGE (`Other Cities`)-[:TO_CITY]->(Chennai)
    MERGE (`Other Cities`)-[:TO_CITY]->(Mumbai)
    MERGE (`Other Cities`)-[:TO_CITY]->(Kolkata)
    MERGE (`Other Cities`)-[:TO_CITY]->(DelhiNCR)
    RETURN *
    

    3) 将市内和城际旅行与城市之树联系起来:

    MATCH (IntraCity: TravelType { name: 'IntraCity' })
    MATCH (InterCity: TravelType { name: 'InterCity' })
    MATCH (Bangalore: Location { name: 'Bangalore' })
    MATCH (Hyderabad:Location { name: 'Hyderabad' })
    MATCH (Chennai: Location { name: 'Chennai' })
    MATCH (Pune: Location { name: 'Pune' })
    MATCH (DelhiNCR: Location { name: 'DelhiNCR' })
    MATCH (Mumbai: Location { name: 'Mumbai' })
    MATCH (Kolkata: Location { name: 'Kolkata' })
    MATCH (`Other Cities`: Location { name: 'Other Cities' })
    CREATE (IntraCity)-[:TO_CITY]->(Bangalore)
    CREATE (InterCity)-[:FROM_CITY]->(Bangalore)
    CREATE (IntraCity)-[:TO_CITY]->(Hyderabad)
    CREATE (InterCity)-[:FROM_CITY]->(Hyderabad)
    CREATE (IntraCity)-[:TO_CITY]->(Chennai)
    CREATE (InterCity)-[:FROM_CITY]->(Chennai)
    CREATE (IntraCity)-[:TO_CITY]->(Pune)
    CREATE (IntraCity)-[:TO_CITY]->(Pune)
    CREATE (IntraCity)-[:TO_CITY]->(DelhiNCR)
    CREATE (InterCity)-[:FROM_CITY]->(DelhiNCR)
    CREATE (IntraCity)-[:TO_CITY]->(Mumbai)
    CREATE (InterCity)-[:FROM_CITY]->(Mumbai)
    CREATE (IntraCity)-[:TO_CITY]->(Kolkata)
    CREATE (InterCity)-[:FROM_CITY]->(Kolkata)
    CREATE (IntraCity)-[:TO_CITY]->(`Other Cities`)
    CREATE (InterCity)-[:FROM_CITY]->(`Other Cities`)
    RETURN *
    

    我面临的问题是,管理和查询这些节点和关系很快就会失控。因此,我无法 正确地查询它。 有没有更好的方法来模拟城市间和城市间的旅行,你可以指出我犯的任何明显错误。

    如有任何建议,我们将不胜感激。

    0 回复  |  直到 7 年前