Neo4j Return 节点类型到客户端代码

Neo4j Return Node Type to Client-Side Code

我使用 Neo4j 修改了 LAMP 堆栈。我正在尝试 return 从我的中间件中的查询到我的客户端的节点类型 Javascript。我正在使用 Graphaware PHP 库来处理我的中间件 (PHP) 和我的数据库之间的身份验证。

我只需要知道 Cypher 查询语言中是否有包含节点类型的内容:我可以放入 RETURN 子句中的函数,或者 returned 中的内容return 对象。例如,如果我有以下查询:

MATCH (a:Person)--(b:Institution) 
WHERE a.name CONTAINS "David" 
RETURN a,b;

有什么我可以添加到 Cypher 查询中的,这样我就可以在节点类型 "a" 和 "b" return 加入我的中间件后区分它们吗?现在我无法区分它们,除非在我的中间件中做一个巨大的大量 switch 语句,该语句具有特定于每个节点类型的属性来区分它们,或者为每个可能的节点编写单独的查询 return (这确实在我的项目中不能很好地扩展。

Neo4j Workbench 似乎具有此功能,因为它会自动使相同类型的节点具有相同的颜色。但是通过查看 JSON 对象 return 从 workbench 中的查询编辑的 workbench 似乎并不明显 workbench 如何区分不同的节点类型。

如果您使用的是 Neo4j 3.1 或更高版本,则可以使用地图投影来添加 returned 数据中节点上的标签。

MATCH (a:Person)--(b:Institution) 
WHERE a.name CONTAINS "David" 
RETURN a{.*, labels:labels(a)}, b{.*, labels:labels(b)};

请记住,标签应该是一个集合,因为节点可以是 multi-labeled。

编辑

如果使用版本 < 3.1,您可能只需要 return 标签作为单独的列:

MATCH (a:Person)--(b:Institution) 
WHERE a.name CONTAINS "David" 
RETURN a, labels(a), b, labels(b);

不需要 return 额外的信息,因为 return 发送到 GraphAware php 客户端的节点对象包含节点标签。

您可以只过滤结果的记录,将附加信息添加到您传递给前端的响应中。

PHP 中的示例:

$result = $this->client->run('MATCH (n:Person)-[:WORKS_AT]->(c) WHERE n.name = {name} RETURN n, c', ['name' => 'Pol']);

$frontendResult = [];

foreach ($result->records() as $record) {
   $frontendResult[] = array_map(function(Node $value) {
    return [
      'properties' => $value->values(),
      'type' => $value->labels()[0]
    ];
 }, $record->values());
}

print_r(json_encode($frontendResult, JSON_PRETTY_PRINT));

这会产生以下 json :

[
    [
        {
            "properties": {
                "name": "Pol"
            },
            "type": "Person"
        },
        {
            "properties": {
                "name": "Acme"
            },
            "type": "Company"
        }
    ]
]

labels()[0] 假设您希望节点上只有一个标签,这在标准的 neo4j 应用程序中当然并不总是正确的。