关于cypher:neo4j一次返回根节点,并且json中的所有关系和结束节点

neo4j return root node once, and all relationships and end-nodes in json

我正在尝试对节点已知的所有内容进行html查看。

因此,如果我选择该节点nRETURN n,我将得到一个带有n: { stuff ... }的json对象,如果我还返回其关系和连接的节点RETURN n,r,n2,那么现在我会得到一个真正冗长的json对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
  {
    n: { originating node details },
    r: { relationship details },
    n2: { connected node details }
  },
  {
    n: { originating node details },
    r: { relationship details },
    n2: { connected node details }
  },
  {
    n: { originating node details },
    r: { relationship details },
    n2: { connected node details }
  }
]

相同的确切数据在n中多次。因此,从理论上讲,这是可以的,我可以说var seedNodeData = results[0].n并将其用作获取主节点数据的方式,然后再分别遍历所有对象以列出连接的节点数据。但是,这似乎浪费了传输的数据。

当前,为了限制该数据,我只是RETURN r,n2,因为第一个始终是相同的,但是随后我需要做一个单独的调用来获取n的数据。

是否有一种方法可以调用一次以获取n的信息,然后根据需要多次调用[r]-(n2),并将其package到一个密码查询中?


您可以将亲戚和亲戚聚集到一个集合中。
这样的事情对您有用吗?

1
2
3
match n-[r]->n2
with n, [type(r), n2] as relative
return { root: n, relatives: collect(relative) }

我将使用一组地图来描述每个其他节点以及将它们连接起来的关系。

1
2
MATCH (n)-[r]-(o) WHERE ...
RETURN n AS node, labels(n) AS node_labels, COLLECT({rel: r, rel_type: type(r), other: o, other_labels: labels(o)}) AS relations

使用此RETURN语句,您只会获得一次主题节点(及其属性和标签),以及描述关系(包括类型和属性)以及相关节点(标签和属性)的地图列表。包括属性)。

输出将只是一个"行",其结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[
    {"subject_prop1": 1,"subject_prop2": 2, ...},
    ["SubjectLabel1","SubjectLabel2", ...],
    [
        {
           "rel": {"rel_prop1": 1,"rel_prop2": 2, ...},
           "rel_type":"RELTYPE",
           "other": {"other_prop1": 1,"other_prop2": 2, ...},
           "other_labels": ["Label1","Label2", ...],
        },
        {
            ...
        }
    ]
]

(我从结构中排除了Neo4j样板。)