Индуцированные подграфы в neo4j

У меня есть граф в neo4j, и для заданного узла N я хотел бы найти все узлы, которые достижимы на пути не длиннее P шагов от N, а также все связи между этим набором узлов. Кажется, что это возможно либо с Cypher, либо с Traversal framework; один предпочтительнее другого? Я делаю это из Java со встроенной базой данных, и мне нужно будет выполнять дальнейшие запросы к подграфу. Я ковырялся и не нашел убедительных ответов.


person betseyb    schedule 05.06.2013    source источник


Ответы (1)


Я думаю, что шифрование — это самый краткий способ получения желаемых данных, запроса путей переменной длины, некоторого сбора и уточнения:

Если n — это внутренний идентификатор вашего узла N, а ваш P равен 5:

START begin = node(n)             // or e.g. index lookup
MATCH p = (begin)<-[r*..5]-(end)  // match all paths of length up to 5
WITH distinct nodes(p) as nodes   // collect the nodes contained in the paths
MATCH (x)<-[r]-(y)                // find all relationships between nodes
WHERE x in nodes and y in nodes   // which were found earlier
RETURN distinct x,r,y             // and deduplicate as you find all pairs twice

Это может быть не самый эффективный способ, но, по крайней мере, объяснение плана выполнения в http://console.neo4j.org/ предполагает, что y in nodes считается перед MATCH (x)-[r]-(y).

Я не мог придумать, как избежать двойного сопоставления отношений, поэтому distinct в операторе return.

person Thomas Fenzl    schedule 05.06.2013
comment
Спасибо, я попробую это! Кажется, что создание новой встроенной базы данных и помещение в нее графа — лучший способ выполнить дополнительные операции над этим подграфом. - person betseyb; 06.06.2013