我使用Neo4j图形数据库。 我的查询从我知道的起始节点(以某种方式遍历图形)中找到节点,作为查询的参数。
我想标记这些起始节点,因为我的查询可以在返回的图的另一部分中多次返回这些相同的节点。
这是一个伪造的伪查询示例:
MATCH (n0 {name:"john"}), (n1 {name:"doe"})
WITH n0, n1
MATCH p=((P)-[:LINK*1..5]->(n0)-[:LINK]->(n1)->[:LINK*1..5]->(N))
WITH collect(P) + collect(N) + n0 as nodes
RETURN nodes;
我想让n0和n1带有一些特殊的新属性,因为结果可以包含其他具有相同属性/名称的节点。
最好用数组来组织结果,如下所示:
[
[P0, P1, P2, P3],
[n0, n1], <--- The 2 starting nodes in the middle !
[N0, N1, N2, N3]
]
是否可以在不更新数据库的情况下从结果中标记一部分节点?
答案 0 :(得分:0)
是的,您可以将labels添加到这些节点,例如:StartNode或:Start或类似节点。
实际上,您应该已经在图形中使用标签,通常当我们看到没有标签的查询时,这是一个错误,因为这需要对所有节点进行扫描。请根据节点在图表中的角色或角色(例如:Person,:Movie或类似名称)标记您的节点,并确保在查询中也使用适当的标签。
还需要标签才能添加indexes and constraints,这也可能会加快查询速度。
节点可以是多标签的,因此此时您可以添加更多特定的标签以支持特殊情况,例如您在此处的要求。如果在这些标签上添加:StartNode标签,然后在查询中使用该标签,则将在所有:StartNode标签的节点上使用标签扫描,如果只有这些标签带有该标签,则查找将很快。 / p>
答案 1 :(得分:0)
我建议重组查询以返回您需要了解的最低要求(以提高性能和简便性)。
在您的情况下,您有2个不同的密码(此处为最简单的形式)
MATCH (n0 {name:"john"})-[:LINK]->(n1 {name:"doe"})-[:LINK]->()
MATCH (P)-[:LINK*1..5]->(n0)
RETURN COLLECT(P);
和
MATCH ()-[:LINK]->(n0 {name:"john"})-[:LINK]->(n1 {name:"doe"})
MATCH (n1)->[:LINK*1..5]->(N)
RETURN COLLECT(N);
使用相同的起始MATCH断言:LINK
存在。它们是不同的,因为两个查询之间没有其他障碍。因此,将它们组合在一起的方式将返回这两个密码的笛卡尔积。
您可以使用WITH将这两个密码组合在一起,以避免创建笛卡尔积
MATCH (n0 {name:"john"})-[:LINK]->(n1 {name:"doe"})
MATCH (P)-[:LINK*1..5]->(n0)
WITH COLLECT(P) as p, n0, n1;
MATCH (n1)->[:LINK*1..5]->(N)
RETURN [p, [n0, n1], COLLECT(N)] as nodes
// Or you could keep the return more normal like this
// RETURN p, n0, n1, COLLECT(N) as n
现在,如果您真的想像问题中那样标记节点,则可以将所有节点数据复制到地图中并标记地图...
MATCH (n0 {name:"john"})-[:LINK]->(n1 {name:"doe"})
MATCH (P)-[:LINK*1..5]->(n0)
WITH COLLECT({labels:LABELS(P), properties:PROPERTIES(P), id:ID(P), mark:"P"}) as p, n0, n1;
MATCH (n1)->[:LINK*1..5]->(N)
RETURN [p, [n0, n1], COLLECT({labels:LABELS(N), properties:PROPERTIES(N), id:ID(N), mark:"N"})] as nodes
但是,当您最终在复制整个数据集时,进行了微小的微不足道的更改时,通常暗示着您正在使事情变得比原本要复杂的多。另外,在这种情况下,“标记”是完全多余的,因为所有内容都已被列分开(标记)。