使用Cypher 2.0.0查询可选关系的正确方法

时间:2013-08-29 22:40:11

标签: neo4j cypher

我正在试图找出在返回主要项目集时查询其他可选关系的正确方法(或者如果有更多惯用的方法来完成同样的事情)。

我在http://console.neo4j.org/?id=747b3x设置了一个示例。我有三个节点,其中一个有两个标签和一个IS_A。我想查询所有项目并返回项目本身以及任何相关标签和事物。

我正在尝试创建的结果集如下:

Item     Tags        IS
-------  ----------  --------
1        ['A', 'B']  null
2        null        null
3        null        'foo'

这是我目前的查询:

MATCH (i:Item)
WHERE HAS(i.name)  // in reality, statements to narrow down i
WITH i
MATCH (i)-[?:HAS]->(t:Tag), (i)-[?:IS_A]->(s:Thing)
RETURN i.name AS item, COLLECT(t.name) AS tags, s.name AS is 

在控制台中,这会给出一个空指针异常,但在我的服务器上,它似乎只返回包含标记和与之关联的内容的项目。实现这一目标的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

MATCH (i:Item) 
WITH i 
MATCH (i)-[?:HAS|:IS_A]->(n) 
RETURN i.name AS Item, COLLECT(n.tag_name) AS Tags, n.is_name AS IS

如果有必要区分:HAS:IS_A个节点上的名称类型(或者只是将name属性复制到tag_name以及is_name),那么这是可行的。但是,如果Item没有标记,那么您将获得一个空列表,而不是NULL

编辑:

您可能尝试的另一种方法,虽然它在控制台上不起作用,但我不想启动新的数据库:

MATCH (i:Item)
WITH i
MATCH (i)-[?:HAS]->(t:Tag)
RETURN i, t
MATCH (i)-[?:IS_A]->(s:Thing)
RETURN i.name as item, COLLECT(t.name) AS tags, s.name AS is