2017-01-30 2 views
0

Neo4j를 사용하여 수정 된 LAMP 스택이 있습니다. 내 미들웨어의 쿼리에서 노드 유형을 내 클라이언트 측 자바 스크립트로 반환하려고합니다. 나는 내 미들웨어 (PHP)와 데이터베이스 간의 인증을 처리하기 위해 Graphaware PHP 라이브러리를 사용하고 있습니다.Neo4j 클라이언트 측 코드로 노드 유형 반환

Cypher 쿼리 언어에 노드 유형이있는 것이 있는지, 즉 RETURN 절에 넣을 수있는 함수 또는 반환 객체에 반환 된 값이 있는지 알아야합니다. 나는 다음과 같은 질문을했다 예를 들어, :

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

내가 사이퍼 쿼리에 추가 할 수있는 것도 그들이 내 미들웨어로 돌아 후에 내가 "A"와 "B"노드 유형을 차별화 할 수 있는가? 지금 당장은 각 미들웨어에 대대적 인 스위치 문을 작성하지 않고 각 노드 유형별로 구분하여 특성을 설명하거나 리턴 할 모든 가능한 노드에 대해 별도의 쿼리를 작성하지 않고 말할 수는 없습니다. 내 프로젝트).

Neo4j Workbench는 자동으로 동일한 유형의 노드를 동일한 색상으로 만들기 때문에이 기능을 갖고있는 것 같습니다. 그러나 워크 벤치의 쿼리에서 반환 된 JSON 객체를 살펴보면 워크 벤치가 다른 노드 유형을 어떻게 구별하는지 명확하지 않은 것으로 보입니다.

답변

4

없다 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 애플리케이션.

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

노드는 다중 레이블이 될 수 있으므로 레이블은 컬렉션이어야합니다. 편집

버전 < 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 –