Не получается изолированный узел в neo4j

Я воспользовался помощью этого ответа, он отлично работает, но не для изолированных узлов означает один узел без отношений (дочерние узлы). То, что я получаю в этом случае, даже не этот один узел. Пожалуйста, помогите мне, я новичок в neo4j, это было бы большой помощью

ссылка для ответа

OPTIONAL MATCH path = (x)-[*0..100]->()       
WHERE ID(x) = 65
UNWIND nodes(path) as node
UNWIND rels(path) as rel

WITH collect(distinct node) as nodes,collect(distinct rel) as rels
// WITH apoc.coll.flatten(collect(nodes(path))) as nodes, apoc.coll.flatten(collect(relationships(path))) as rels
WITH apoc.coll.toSet([n in nodes WHERE n is not null 
            | { id: id(n),label: labels(n),type:"",metadata: properties(n)  } ]) as nodes,
     apoc.coll.toSet([r in rels WHERE r is not null 
            | { id: id(r),source: id(startNode(r)),relation: type(r),target: id(endNode(r)), directed: "true"  } ]) as rels

RETURN { graph: { type:"",label: "",directed: "true",nodes: nodes,edges: rels,
         metadata:{ countNodes: size(nodes),countEdges: size(rels) } } } as graph;

Спасибо


person Awais Khan    schedule 22.11.2017    source источник


Ответы (1)


Проблема в следующем: UNWIND rels(path) as rel

Разматывать коллекцию означает брать эту запись и превращать ее в запись для каждого элемента в коллекции, умножая записи. Когда коллекция пуста (для изолированного узла не будет отношений), это умножение на ноль... оно стирает записи с пустыми коллекциями.

Вы можете использовать оператор CASE, чтобы заменить коллекцию нулевым значением вместо пустой коллекции (нулевое значение будет удалено при повторном сборе). Это ведет учет, когда вы РАССЛАБЛЯЕТЕСЬ.

UNWIND case when size(rels(path)) = 0 then [null] else rels(path) end  as rel
person InverseFalcon    schedule 22.11.2017
comment
Спасибо, отлично работает :). Не могли бы вы поделиться документацией/блогом, когда я смогу подробно узнать о UNWIND. - person Awais Khan; 22.11.2017
comment
Вот документация по UNWIND. Хотя это правда, что он расширяет списки в строки, не совсем ясно, что это мультипликативная операция, и что пустой список означает, что связанная строка будет стерта. - person InverseFalcon; 22.11.2017