如何显示所有节点和关系'从Neo4j路径依次命名

时间:2017-08-07 23:21:22

标签: neo4j path cypher

我想知道如何在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

1 个答案:

答案 0 :(得分:0)

您的问题中显示的输出表明您的数据格式不正确。例如,并非所有关系实际上都有name。这个答案假定数据格式正确,但如果需要,可以调整以处理丢失的name属性。

由于你的问题并不清楚你想要什么,这里有一些选择。

选项1

此查询将为每个路径的每个关系返回一个名称三元组(在列表中):

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"]

选项2

如果您希望将每个路径的结果分开,可以将UNWIND path_names AS names RETURN names;替换为RETURN path_names;。这会为每条路径产生类似的效果:

[["porsche", "is a", "car"], ["car", "is a subtype of", "vehicle"]]

选项3

如果您想从所有路径获取不同的“步骤”,您可以这样做:

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的结果,除了每个“步骤”都是不同的。