neo4j收集节点和关系类型b - > a< -c,a< -d

时间:2014-11-17 12:20:02

标签: neo4j cypher

我正在使用由neo4j支持的VivaGraph扩展maxdemarzi的优秀图形可视化示例(http://maxdemarzi.com/2013/07/03/the-last-mile/)。

我想显示类型

的关系
a-->b<--c,b<--d

我尝试了查询

MATCH p = (a)--(b:X)--(c),(b:X)--(d)  
RETURN EXTRACT(n in nodes(p) | {id:ID(n), name:COALESCE(n.name, n.title, ID(n)), type:LABELS(n)}) AS nodes,  
EXTRACT(r in relationships(p)| {source:ID(startNode(r)) , target:ID(endNode(r))}) AS rels

看起来命名查询仅选择a-->b<--c模式并省略b<--d模式。

我错过了什么......我不能在命名查询中添加多个模式吗?

1 个答案:

答案 0 :(得分:3)

最直接的问题是MATCH子句中的逗号将第一个模式与第二个模式分开。变量&#39; p&#39;只存储第一个模式。这就是为什么你没有得到你想要的结果。独立于此,您将面临松散约束的风险。通过在名为&#39; b&#39;的两个节点上放置一个标签。在两种模式中。第二个&#39; b&#39;节点不应该有标签。

所以这是一个应该有效的查询版本。

MATCH p1=(a)-->(b:X)<--(c), p2=(b)<--(d)
WITH nodes(p1) + d AS ns, relationships(p1) + relationships(p2) AS rs
RETURN EXTRACT(n IN ns | {id:ID(n), name:COALESCE(n.name, n.title, ID(n)), type:LABELS(n)}) AS nodes,
       EXTRACT(r in rs| {source:ID(startNode(r)) , target:ID(endNode(r))}) AS rels

捕获两个路径,然后从节点和两个路径的关系构建集合。节点集合实际上只从p1中提取节点并添加&#39; d&#39;节点。您可以将该部分写为

nodes(p1) + nodes(p2) as ns

然后&#39; b&#39;节点将在列表中出现两次。