2015-10-27 2 views
1

Я хотел бы получить самый длинный путь, который связан с одним родителем с помощью запроса Neo4J Cypher.Удалить пути, которые являются подмножествами более длинного пути

Мои текущие запросы, как это:

MATCH р = (N1: Node) - [REL * .. 2] -> (N2: Node) WHERE N2.RIC = ~ "некоторые тикер *" ВОЗВРАТ р предел 50

Однако, я получаю результаты, как это

a-> b-> родитель b-> родитель

по моему мнению, я хотел бы сохранить только самый длинный путь , Кроме того, есть в любом случае, чтобы вернуть направление запроса? IE: я могу видеть из/в отношение в выводе запроса.

Благодарим заранее!

ответ

1

Если вы хотите только самый длинный путь, то вы можете сделать:

MATCH path=(N1:Node)-[REL*..2]->(N2:Node) 
WHERE N2.RIC =~"some ticker.*" 
RETURN p 
ORDER BY length(p) DESC 
LIMIT 1 

Что касается получения направления, это зависит от водителя, который вы используете. В конечной точке транзакции HTTP Neo4j, если вы укажете REST для resultDataContents, он вернет directions для любых возвращаемых объектов пути. Вот как вы установили, что:

http://neo4j.com/docs/stable/rest-api-transactional.html#rest-api-execute-statements-in-an-open-transaction-in-rest-format-for-the-return

Вот пример того, как это выглядит:

 "rest": [ 
     { 
      "relationships": [ 
      "http://localhost:7474/db/data/relationship/587" 
      ], 
      "nodes": [ 
      "http://localhost:7474/db/data/node/1002", 
      "http://localhost:7474/db/data/node/1001" 
      ], 
      "directions": [ 
      "<-" 
      ], 
      "length": 1, 
      "start": "http://localhost:7474/db/data/node/1002", 
      "end": "http://localhost:7474/db/data/node/1001" 
     } 
     ] 

EDIT:

В ответ на ваш комментарий, чтобы получить самый длинный путь для каждого родителя:

MATCH path=(N1:Node)-[REL*..2]->(N2:Node) 
WHERE N2.RIC =~"some ticker.*" 
WITH N1, N2, collect(p) AS paths 
ORDER BY length(p) DESC 
RETURN N1, N2, paths[0] AS longest_path 

Я не был уверен, какая сторона должна быть родительской, поэтому я вернул оба N1 и N2, которые должны дать вам самый длинный путь для каждой комбинации этих двух. Вы можете удалить один из них, чтобы получить самый длинный путь, ведущий к/из оставшегося узла.

+0

спасибо. я не хочу самого длинного пути, я хочу самый длинный путь различных вариантов. A-> B-> C -> родительский D-> E-> родительский –

+0

Мой шифр: 'MATCH path = (n) - [: REL *] -> (m), где id (n) = return path'. Мне нужны все неперекрывающиеся пути. Он возвратил пути: 'a-> b',' a-> b-> c', 'a-> b-> d',' a-> c', 'a-> c-> e'. Я не хочу 'a-> b' и' a-> c' в выходе, поскольку они являются частью/подмножеством других возвращенных путей. Как мне это сделать? Это можно сделать в cypher? – Mahesha999

+0

Возможно, вы можете это сделать, но было бы слишком сложно ответить в комментарии, и вы вряд ли привлечете много людей, чтобы придумать ответ, если не задать вопрос из этого –