2017-01-30 7 views
0

Neo4jを使用して変更されたLAMPスタックがあります。私はミドルウェアのクエリからクライアント側のJavascriptにノード型を返そうとしています。私は、私のミドルウェア(PHP)と私のデータベース間の認証を処理するためにGraphawareのPHPライブラリを使用しています。Neo4jノードタイプをクライアントサイドコードに戻す

Cypherクエリ言語にノード型を持つものがあるかどうかを知る必要があります.RETURN句に入れることができる関数、または返すオブジェクトに返されるものです。私は次のクエリがあった場合たとえば、:

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

を、彼らは私のミドルウェアに戻ってきた後、私はノードタイプ「a」および「b」を区別することができますので、私はサイファークエリに追加できるものはありますか?今は、私のミドルウェアで大規模なswitch文を各ノードタイプに特有の属性を持つものにしないと、それらを区別することはできません。また、返す可能性のあるノードごとに個別のクエリを書くこともできません。私のプロジェクト)。

Neo4j Workbenchは、同じタイプのノードを自動的に同じ色にするため、この機能を持つようです。しかし、ワークベンチのクエリから返されたJSONオブジェクトを見ることで、ワークベンチがどのように異なるノードタイプを区別しているのかは明らかではないようです。

答えて

4

Nodeオブジェクトがに返された追加情報を返す必要はありませんGraphAware PHPクライアントにはノードラベルが含まれています。

結果のレコードをフィルタリングするだけで、フロントエンドに渡すレスポンスに追加情報を追加することができます。 PHPで

例:

次JSONを生成する
$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)); 

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

labels()[0]はもちろん、常に真実ではないである、あなたは、ノード上の1つのラベルだけを期待すると仮定しています標準のneo4jアプリケーションです。

+0

ありがとう!これは私が探していたGraphawareのドキュメントが欠けています!チャームのように働いた! :) –

+0

これは月以来文書化されていますhttps://github.com/graphaware/neo4j-php-client#node –

2

Neo4j 3.1以降を使用している場合、マッププロジェクションを使用して、返されたデータのノードにあるラベルを追加できます。

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

ノードには複数のラベルを付けることができるので、ラベルはコレクションである必要があります。

EDIT

バージョン< 3.1を使用している場合、あなたはおそらく別々の列としてラベルを返却する必要があります:

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

私は残念なことにNeoj4 3.0.8を実際に使用しています。私のプロジェクトではDockerを使用しています。最新の安定したNeo4jコンテナのリリースは3.0.8です。私は3.1を使ってみましたが、neo4j-shellにはバグがあり、動作しません。 :S –

関連する問題