Php Neo4j将节点类型返回到客户端代码

Php Neo4j将节点类型返回到客户端代码,php,neo4j,lamp,graphaware,Php,Neo4j,Lamp,Graphaware,我有一个使用Neo4j改进的灯组。我试图将节点类型从中间件中的查询返回到客户端Javascript。我正在使用Graphaware PHP库来处理中间件(PHP)和数据库之间的身份验证 我只需要知道在Cypher查询语言中是否有节点类型的东西:可以放在RETURN子句中的函数,或者在RETURN对象中返回的东西。例如,如果我有以下查询: MATCH (a:Person)--(b:Institution) WHERE a.name CONTAINS "David" RETURN a,b; 我

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

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

MATCH (a:Person)--(b:Institution) 
WHERE a.name CONTAINS "David" 
RETURN a,b;
我是否可以向Cypher查询添加任何内容,以便在节点类型“a”和“b”返回到我的中间件后区分它们?现在,如果我的中间件中没有一个巨大的switch语句来区分它们,该语句具有特定于每个节点类型的属性来区分它们,或者为每个可能返回的节点编写单独的查询(这在我的项目中不能很好地扩展)


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

如果您使用的是Neo4j 3.1或更高版本,则可以使用map projection添加返回数据中节点上的标签

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);

如果使用的是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);

不需要返回额外的信息,因为返回到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应用程序中当然不总是正确的。

由于返回到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应用程序中当然不总是正确的。

不幸的是,我实际上使用的是Neoj4 3.0.8。我的项目使用Docker,最新的稳定的Neo4j容器版本是3.0.8。我尝试使用3.1,但neo4j shell有一个bug,无法工作,这是填充数据库所需要的:不幸的是,我实际上在使用Neoj4 3.0.8。我的项目使用Docker,最新的稳定的Neo4j容器版本是3.0.8。我尝试使用3.1,但neo4j shell有一个bug,无法工作,这是填充数据库所需要的:谢谢你!这是我一直在寻找的丢失的Graphaware文档!工作得很有魅力!:)这是几个月以来的记录,谢谢!这是我一直在寻找的丢失的Graphaware文档!工作得很有魅力!:)这是几个月以来的记录