Php Neo4j将节点类型返回到客户端代码
我有一个使用Neo4j改进的灯组。我试图将节点类型从中间件中的查询返回到客户端Javascript。我正在使用Graphaware PHP库来处理中间件(PHP)和数据库之间的身份验证 我只需要知道在Cypher查询语言中是否有节点类型的东西:可以放在RETURN子句中的函数,或者在RETURN对象中返回的东西。例如,如果我有以下查询: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; 我
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文档!工作得很有魅力!:)这是几个月以来的记录