我想知道如何在Neo4j Cypher中显示路径p生成的每个节点和关系的名称。
我有这个问题:
MATCH (m { name: 'porsche' }),(n { name: 'vehicle' }), p =(m)-[r*]->(n)
return collect(p);
══════════════════════════════╕
│"collect(p)" │
╞══════════════════════════════╡
│[[{"name":"porsche"},{"name":"│
│is a"},{"name":"car","type":"l│
│abel"},{"name":"car","type":"l│
│abel"},{"name":"is a subtype o│
│f"},{"name":"vehicle","type":"│
│label"}],[{"name":"porsche"},{│
│"name":"is a"},{"name":"car","│
│type":"label"},{"name":"car","│
│type":"label"},{},{"name":"veh│
│icle","type":"label"}]] │
└──────────────────────────────┘
但是我希望它显示每个节点的名称,然后按顺序显示每个关系的名称:
'porsche' 'is a' 'car'
'car' 'is a subtype of' vehicle
答案 0 :(得分:0)
您的问题中显示的输出表明您的数据格式不正确。例如,并非所有关系实际上都有name
。这个答案假定数据格式正确,但如果需要,可以调整以处理丢失的name
属性。
由于你的问题并不清楚你想要什么,这里有一些选择。
此查询将为每个路径的每个关系返回一个名称三元组(在列表中):
MATCH ({ name: 'porsche' })-[rels*]->({ name: 'vehicle' })
WITH [r IN rels | [STARTNODE(r).name, r.name, ENDNODE(r).name]] AS steps
UNWIND steps AS step
RETURN step;
示例输出(针对一条路径):
["porsche", "is a", "car"]
["car", "is a subtype of", "vehicle"]
如果您希望将每个路径的结果分开,可以将UNWIND path_names AS names RETURN names;
替换为RETURN path_names;
。这会为每条路径产生类似的效果:
[["porsche", "is a", "car"], ["car", "is a subtype of", "vehicle"]]
如果您想从所有路径获取不同的“步骤”,您可以这样做:
MATCH ({ name: 'porsche' })-[rels*]->({ name: 'vehicle' })
WITH [r IN rels | [STARTNODE(r).name, r.name, ENDNODE(r).name]] AS steps
UNWIND steps AS step
RETURN DISTINCT step;
结果将类似于选项1的结果,除了每个“步骤”都是不同的。