2017-08-02 69 views
1

neo4j数据一样,如下所示:修改暗号查询

enter image description here

这里我有provincecitycountrycity之间COUNTRY_CITY之间的关系PROVINCE_CITY关系countryprovince之间COUNTEY_PROVINCE关系。当用户用country name调用api时,我想返回所有provincecity。要做到这一点,我已经运行以下查询:

MATCH path=(cn:Country { name: "Bangladesh" })-[:COUNTRY_PROVINCE]->(pv:Province)-[:PROVINCE_CITY]->(ct:City) 
RETURN { x: nodes(path) } 

而且我已经得到了以下结果(国家,省,市)

{ x: nodes(path) } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Dhaka" }, { "name": "Dhaka" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Dhaka" }, { "name": "Narayanganj" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Sylhet" }, { "name": "Sylhet" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Khulna" }, { "name": "Khulna" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Khulna" }, { "name": "Jessore" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Chittagong" }, { "name": "Chittagong" } ] } 
    { "x": [ { "name": "Bangladesh"}, { "name": "Chittagong" }, { "name": "Comilla" } ] } 

现在的问题是,我怎么能得到与省和准城市,如国家名单:

[ 
    { 
     country: { 
      name: "Bangladesh", 
      province: [ 
       { 
        name: "Dhaka", 
        city: [ 
         { name: "Dhaka" }, 
         { name: "Narayanganj" } 
        ] 
       }, 
       { 
        name: "Sylhet", 
        city: [ 
         { name: "Sylhet" } 
        ] 
       }, 
       { 
        name: "Chittagong", 
        city: [ 
         { name: "Chittagong" }, 
         { name: "Comilla" } 
        ] 
       }, 
       { 
        name: "Khulna", 
        city: [ 
         { name: "Khulna" }, 
         { name: "Jessore" } 
        ] 
       }    
      ] 
     } 
    } 
] 

回答

1

我这里模拟您的方案。

加载初始数据集(在问题中描述的数据集类似的):

CREATE (c:Country {name:"Country A"}) 
CREATE (p1:Province {name:"Province A"}) 
CREATE (p2:Province {name:"Province B"}) 
CREATE (c1:City {name:"City A"}) 
CREATE (c2:City {name:"City B"}) 
CREATE (c3:City {name:"City C"}) 
CREATE (c4:City {name:"City D"}) 
CREATE (c)-[:COUNTRY_PROVINCE]->(p1) 
CREATE (p1)-[:PROVINCE_CITY]->(c1) 
CREATE (p1)-[:PROVINCE_CITY]->(c2) 
CREATE (c)-[:COUNTRY_PROVINCE]->(p2) 
CREATE (p2)-[:PROVINCE_CITY]->(c3) 
CREATE (p2)-[:PROVINCE_CITY]->(c4) 

查询:

MATCH (cn:Country { name: "Country A" })-[:COUNTRY_PROVINCE]->(pv:Province)-[:PROVINCE_CITY]->(ct:City) 
WITH cn, pv, collect({name : ct.name}) as cities 
RETURN {coutry : {name : cn.name, province : collect(distinct { name:pv.name, city :cities }) } } 

其结果是:

{ 
    "coutry":{ 
     "name":"Country A", 
     "province":[ 
     { 
      "name":"Province A", 
      "city":[ 
       { 
        "name":"City B" 
       }, 
       { 
        "name":"City A" 
       } 
      ] 
     }, 
     { 
      "name":"Province B", 
      "city":[ 
       { 
        "name":"City D" 
       }, 
       { 
        "name":"City C" 
       } 
      ] 
     } 
     ] 
    } 
} 

上面查询使用collect()函数和DISTINCT运算符来实现desi红色格式。

+1

以下是使用Neo4j 3.1.x的地图投影的布鲁诺回答的一个小变化:MATCH(country:Country {name:“Country A”}) - [:COUNTRY_PROVINCE] - >(province:Province) - [:PROVINCE_CITY] - >(城市:城市) WITH country,province {.name,city:collect(city {.name})}作为省 RETURN [country {.name,province:collect(province)}] as country' – InverseFalcon

0

好吧,如果你要返回路径的节点,这显然你会得到什么。你有几种选择以不同的方式做到这一点:

  1. 退房https://neo4j-contrib.github.io/neo4j-apoc-procedures/index32.html#_from_tojson,例如apoc.convert.toTree可能让你很接近你想要什么。
  2. 自己动手。从任何客户端应用程序和流程(+格式),结果自己(使用Java,Python,C#,...)
  3. 发送查询...

希望这有助于。

问候, 汤姆

+0

谢谢汤姆,我正在看'apoc.convert.toTree'我已经使用javascript'reduce'得到了这个结果并寻找了'neo4j'解决方案。 – sabbir