我目前正在开发一个新的应用程序,我需要管理位置(大陆>国家>地区>城市)。
我正在尝试(没有成功)使用cypher直接从neo4j获取树:
MATCH p = (r:Location)-[:CONTAINS*]->()
WHERE r.category='continent'
RETURN p AS path
现在,我想解析这些数据,所以我可以这样做:
MATCH (r:Location)-[:CONTAINS]->(r2)
WHERE r.category='continent'
OPTIONAL MATCH (r2)-[:CONTAINS]->(r3)
OPTIONAL MATCH (r3)-[:CONTAINS]->(r4)
OPTIONAL MATCH (r4)-[:CONTAINS]->(r5)
OPTIONAL MATCH (r6)-[:CONTAINS]->(r6)
RETURN r.name, r.category, r2.name, r2.category, r3.name, r3.category, r4.name,r4.category, r5.name, r5.category, r6.name, r6.category
但这不是我正在等待的反应,我不喜欢这个解决方案,因为最多有6个关系。如果我这样做,我有可能打破树。
[ { 'r.name': 'Europe','r.category': 'continent','r2.name': 'Germany','r2.category': 'country','r3.name': null,'r3.category': null,'r4.name': null,'r4.category': null,'r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null },
{ 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Paris','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null },
{ 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Versailles','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null },
{ 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Montreuil','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null },
{ 'r.name': 'Europe','r.category': 'continent','r2.name': 'Belgium','r2.category': 'country','r3.name': null,'r3.category': null,'r4.name': null,'r4.category': null,'r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null } ]
有没有办法解析结果/更改我的查询以获得具有'childrens'的树的json格式:
[{"name":"Africa"},{"name":"Europe","childrens":[{"name":"France"},{"name":"Germany"},{"name":"Belgium","childrens":[{"name":"Brussels Capitale","childrens":[{"name":"Brussels Capitale"}]}]}]}]
感谢您的帮助!
佛瑞德。
答案 0 :(得分:1)
是的,你可以使用像非常好的google GSON这样的JSON库来创建你想要的JSON。其中一些库非常擅长使用vanilla数据结构,并将它们转换为JSON对象。
因此,当您在java中执行cypher查询时,从ExecutionEngine对象返回的结果是ExecutionResult对象 - 该类型与Map兼容。基本上,如果您制作Cypher查询以返回正确类型的数据,您可以获取执行结果并将其直接提供给GSON。如何使用GSON将复杂的java对象转换为JSON is here。
的示例您的另一种选择是使用Neo4J REST API通过POST操作向服务器发出Cypher查询,然后尝试按下它发回给您的JSON。我不认为它会向你发送你想要的东西,但你可以非常接近然后从那里使用那种格式。
答案 1 :(得分:1)
使用Neo4j 2.0,您还可以在Cypher中使用文字地图和集合,因此您可以根据自己的喜好构建JSON文档,请参阅此GraphGist作为示例。
答案 2 :(得分:1)
好的......我找到了解决办法:)
MATCH (l:Location) WHERE l.category='continent'
OPTIONAL MATCH (l)-[:CONTAINS]->(l2:Location)
OPTIONAL MATCH (l2)-[:CONTAINS]->(l3:Location)
OPTIONAL MATCH (l3)-[:CONTAINS]->(l4:Location)
OPTIONAL MATCH (l4)-[:CONTAINS]->(l5:Location)
WITH l AS l, l2 AS l2, l3 AS l3, l4 AS l4, COLLECT( DISTINCT { name: l5.name }) AS subl4
WITH l AS l, l2 AS l2, l3 AS l3, subl4, COLLECT( DISTINCT { name: l4.name, children: subl4 }) AS subl3
WITH l AS l, l2 AS l2, subl3 AS subl3, COLLECT( DISTINCT { name: l3.name, children: subl3 }) AS subl2
WITH l AS l, COLLECT( DISTINCT { name: l2.name, children: subl2 }) AS subl
RETURN COLLECT( DISTINCT { name: l.name, children: subl })