Используйте neo4jphp, чтобы получить массив со всеми узлами, связанными с главным узлом.

Я использую Neo4jPHP для написания фрагмента, который даст мне массив всех узлов, связанных с «главным» узлом (A). Узел подключается так:

  A -> B
  B -> C
  C -> D
  C -> E
  B -> F

Это код, который я написал с помощью neo4jPHP:

$client = new Everyman\Neo4j\Client();
$querystring="MATCH path=(n {gid:'58731'})-[:contains*]-(z) RETURN ([x in nodes(path) | x.id]) as names";
$query=new Everyman\Neo4j\Cypher\Query($client,$querystring); 
$result=$query->getResultSet();

foreach($result as $resultItem){
    $resultArray[] = $resultItem['n'];
}   
print_r($resultArray); // prints the array

Проблема в том, что $resultArray повторно хранит узлы, которые относятся к главному узлу (как описано здесь: Странное поведение в neo4j, когда я пытаюсь получить все узлы, которые связаны с главным узлом )

Мой вопрос: есть ли способ с помощью neo4jPhp вернуть массив, который будет содержать все узлы, связанные с «главным» узлом только один раз? Что-то вроде этого:

 $distinctNodes = [B,C,D,E,F]

Спасибо д.


person user1919    schedule 15.01.2015    source источник


Ответы (1)


Этот запрос должен напрямую возвращать массив:

MATCH (n {gid:'58731'})-[:contains*1..]->(z) RETURN COLLECT(DISTINCT z.id) as names
person cybersam    schedule 15.01.2015
comment
Спасибо за ответ! У меня есть одна проблема: идентификатор может совпадать с другим идентификатором другого узла. Использование DISTINCT вызовет проблемы в этом случае, верно? - person user1919; 16.01.2015
comment
Да. в этом случае вы должны использовать уникальное свойство вместо id. Если у вас нет чего-то, что гарантированно будет уникальным, вы можете использовать внутренний идентификатор (через ID(z)). Внутренний идентификатор узла будет уникальным, но имейте в виду, что если узел удален, его внутренний идентификатор может быть переназначен новому узлу. Или вы можете просто сами узлы (т. е. заменить z.id на z) — но они не будут простыми строками. - person cybersam; 16.01.2015
comment
В порядке. Отлично. Я попробую сначала подумать завтра: MATCH (n {gid:'58731'})-[:contains*1..]->(z) RETURN ID(z) как имена - person user1919; 16.01.2015
comment
Вместо этого используйте этот запрос: MATCH (n {gid:'58731'})-[:contains*1..]->(z) RETURN COLLECT(DISTINCT ID(z)) as names. COLLECT() создаст для вас коллекцию (вместо нескольких строк). DISTINCT присутствует в случае, если один и тот же узел появляется несколько раз в наборе результатов. - person cybersam; 16.01.2015