Как получить все имена узлов между двумя узлами, используя neo4jStack Overflow

До сих пор я использовал PHP Rest Api для отправки запросов с зашифрованными запросами и получения ответа обратно. Ответ представляет собой огромную строку, которая затрудняет анализ и не может быть преобразована в JSON.
Теперь я установил Neo4jPHP и пытаюсь выяснить, как написать тот же запрос, что и у меня в cypher.
Это мой запрос:

            MATCH (n:RealNode)-[r:contains*]-(z)  WHERE n.gid='123' RETURN n,z;")

На самом деле я хочу получить список всех имен узлов (name — это свойство внутри каждого узла), который связан с моим n узлом. Как мне это сделать?

Я не могу найти много примеров для Neo4jPHP онлайн, и те, которые я нашел, похоже, не работают. Я скачал последнюю версию отсюда (https://github.com/jadell/neo4jphp).

Спасибо
D.

RE-EDITED

Я пытаюсь этот запрос в neo4j Server:

     MATCH (n)-[r:KNOWS*]-(z)  WHERE n.name='Arthur Dent' AND z.name='Ford Prefect'  RETURN n,z,r;

и я получаю все 3 узла, которые связаны друг с другом. Тот же запрос через neo4jPHP вернет только имя одного узла. Почему это происходит?

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

1

Решение

На уровне Cypher вы можете использовать такой запрос:

MATCH path=(n {name:'Arthur Dent'])-[:KNOWS*]-(z {name:'Ford Perfect'})
RETURN [x in nodes(path) | x.name] as names

Вы назначаете переменную для шаблона, здесь path, в RETURN вы перебираете все узлы вдоль этого пути и извлекаете его name имущество.

2 дополнительных подсказки:

  1. рассмотреть возможность назначения меток, например Person к вашим узлам и использовать декларативный индекс ( CREATE INDEX ON :Person(name) ) чтобы ускорить поиск начального / конечного узла вашего запроса
  2. для соответствий переменной длины пути [:KNOWS*] рассмотрите возможность использования верхнего предела, в зависимости от размера и структуры вашего графика это может быть довольно дорого. [:KNOWS*10] ограничить на 10 градус.
2

Другие решения

После долгих попыток и некоторой помощи от Стефана Армбрустера я заставил его работать, используя Neo4jPHP.
Вот как это выглядит:

    $client = new Everyman\Neo4j\Client();
$querystring="MATCH path=(n {gid:'58731'})-[:contains*]-(z) RETURN LAST([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

Neo4jPHP — очень удобный инструмент, но не очень популярный. Небольшое сообщество и несколько примеров в Интернете. Надеюсь, это кому-нибудь поможет.

1

По вопросам рекламы [email protected]