0

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

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

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

有什么我可以添加到 Cypher 查询中的,以便在节点类型“a”和“b”返回到我的中间件后区分它们吗?现在,如果不在我的中间件中创建一个庞大的 switch 语句,我就无法区分它们,该语句具有特定于每个节点类型的属性来区分它们,或者为每个可能的节点编写单独的查询以返回(这不能很好地扩展我的项目)。

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

4

2 回答 2

4

无需返回额外信息,因为返回到 GraphAware php 客户端的 Node 对象包含节点标签。

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

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 应用程序中并不总是正确的。

于 2017-01-30T21:07:40.413 回答
2

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

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

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

编辑

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

MATCH (a:Person)--(b:Institution) 
WHERE a.name CONTAINS "David" 
RETURN a, labels(a), b, labels(b);
于 2017-01-30T19:24:49.317 回答