Neo4j Cypher:检索多个类型的所有连接节点?
初级密码问题。我知道如何将特定类型的所有节点连接到数据库中的特定人员。在这里,我在10跳内检索某个人的所有朋友:Neo4j Cypher:检索多个类型的所有连接节点?,neo4j,cypher,Neo4j,Cypher,初级密码问题。我知道如何将特定类型的所有节点连接到数据库中的特定人员。在这里,我在10跳内检索某个人的所有朋友: MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friends:Friend) RETURN rebecca, friends 但是我如何扩展它以获得两种类型的节点:Rebecca的朋友或邻居?在匹配本身的标签上没有or,因此您可能必须使用WHERE子句进行筛选: MATCH (rebecca:Person {name:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friends:Friend)
RETURN rebecca, friends
但是我如何扩展它以获得两种类型的节点:Rebecca的朋友或邻居?在匹配本身的标签上没有or,因此您可能必须使用WHERE子句进行筛选:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friendOrNeighbor)
WHERE friendOrNeighbor:Friend or friendOrNeighbor:Neighbor
RETURN DISTINCT rebecca, friendOrNeighbor
请记住,像这样的可变长度关系匹配是为了找到给定最大限制下的所有可能路径,因此这实际上是在做您可能不需要的额外工作,如果该局部图中存在许多关系,这可能会很慢
你可能想考虑一下。如果使用“NODE_GLOBAL”表示唯一性,并使用
maxLevel:10指定上限,则这是更快获取所需节点的更有效方法。在匹配本身的标签上没有OR,因此您可能必须使用WHERE子句进行筛选:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friendOrNeighbor)
WHERE friendOrNeighbor:Friend or friendOrNeighbor:Neighbor
RETURN DISTINCT rebecca, friendOrNeighbor
请记住,像这样的可变长度关系匹配是为了找到给定最大限制下的所有可能路径,因此这实际上是在做您可能不需要的额外工作,如果该局部图中存在许多关系,这可能会很慢
你可能想考虑一下。如果使用“NODE_GLOBAL”表示唯一性,并使用maxLevel:10指定上限,则这是更快获取所需节点的更有效方法。您可以在好友标识符的标签上进行筛选:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(other)
WHERE ALL( x IN ["Friend","Neighbour"] WHERE x IN labels(other) )
RETURN rebecca, other
注意:InverseFalcon的答案是完全正确的,这里它只是做这个过滤器的另一种方法
请注意,这并不理想,朋友
和邻居
在语义上最好地描述为关系,您可以在这里看到
在你的查询中,如果你偏离了图形的自然思维方式(关系很重要!),你就会受到影响。你可以在好友标识符的标签上进行筛选:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(other)
WHERE ALL( x IN ["Friend","Neighbour"] WHERE x IN labels(other) )
RETURN rebecca, other
注意:InverseFalcon的答案是完全正确的,这里它只是做这个过滤器的另一种方法
请注意,这并不理想,朋友
和邻居
在语义上最好地描述为关系,您可以在这里看到
离开了图形的自然思维方式(关系很重要!)你在查询时会受到影响。@Richard这是非常重要的一点!除非整个图都是从Rebecca的角度来看的,否则:Friend和:Neighbor节点不会提供关于谁的朋友或邻居的上下文。关系提供了这种上下文,对模型的更改也可能需要更简单的查询。确切地说,一般来说,除了起始节点外,对于此类查询,您不必进行除度之外的任何筛选,从而使遍历非常快速和准确simple@Richard非常重要的一点!除非整个图都是从Rebecca的角度来看的,否则:Friend和:Neighbor节点不会提供关于谁的朋友或邻居的上下文。关系提供了这种上下文,对模型的更改也可能需要更简单的查询。确切地说,一般来说,除了起始节点外,对于此类查询,您不必进行除度之外的任何筛选,从而使遍历非常快速和简单