У меня есть граф в neo4j, и для заданного узла N я хотел бы найти все узлы, которые достижимы на пути не длиннее P шагов от N, а также все связи между этим набором узлов. Кажется, что это возможно либо с Cypher, либо с Traversal framework; один предпочтительнее другого? Я делаю это из Java со встроенной базой данных, и мне нужно будет выполнять дальнейшие запросы к подграфу. Я ковырялся и не нашел убедительных ответов.
Индуцированные подграфы в neo4j
Ответы (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
Спасибо, я попробую это! Кажется, что создание новой встроенной базы данных и помещение в нее графа — лучший способ выполнить дополнительные операции над этим подграфом.
- person betseyb; 06.06.2013