首页 文章

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

提问于
浏览
1

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

    问题中显示的输出表明您的数据格式不正确 . 例如,并非所有关系实际上都有 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的结果,除了每个“步骤”将是不同的 .

相关问题