在收集/拆分集合上执行MATCH

时间:2014-01-10 11:11:52

标签: neo4j cypher

我正在尝试模仿neo4j浏览器的功能,以便在我的前端显示我的图形。 neo4j浏览器为每个查询发出两个调用 - 第一个调用执行用户在查询框中键入的查询,第二个调用使用查找在第一个用户输入的查询中返回的每个节点之间的关系。

{
  "statements":[{
    "statement":"START a = node(1,2,3,4), b = node(1,2,3,4)
                 MATCH a -[r]-> b RETURN r;",
    "resultDataContents":["row","graph"],
    "includeStats":true}]
}

在我的应用程序中,我希望更高效,因此我希望能够在单个查询中获取所有节点和关系。我目前的查询是:

START person = node({personId})
MATCH person-[:RELATIONSHIP*]-(p:Person)
WITH distinct p
MATCH p-[r]-(d:Data), p-[:DETAILS]->(details), d-[:FACT]->(facts)
RETURN p, r, d, details, facts

此查询运行良好,但它没有给我链接到原始“人”的“d”和“详细信息”节点。

我尝试将“p”和“person”结果加入一个集合中:

collect(p) + collect(person) AS people 

但这不允许我对结果集合执行MATCH。据我所知,没有办法拆分收藏品。

我目前看到的唯一选择是将查询分成两部分;返回“collect(p)+ collect(person)AS people”集合,然后在第二个查询中使用节点值。有没有更有效的方法来执行此查询?

1 个答案:

答案 0 :(得分:3)

如果您使用量词*0.. RELATIONSHIP也匹配深度0,在这种情况下personp相同。没有指定限制的*默认为1..infinity

START person = node({personId})
MATCH person-[:RELATIONSHIP*0..]-(p:Person)
WITH distinct p
MATCH p-[r]-(d:Data), p-[:DETAILS]->(details), d-[:FACT]->(facts)
RETURN p, r, d, details, facts