我正在使用由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
模式。
我错过了什么......我不能在命名查询中添加多个模式吗?
答案 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;节点将在列表中出现两次。