初学者Cypher问题。我知道如何将特定类型的所有节点附加到我的数据库中的特定人员。在这里,我正在检索一个特定人的所有朋友,在10跳之内:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friends:Friend)
RETURN rebecca, friends
但是我如何扩展它以获得两种类型的节点:Rebecca的朋友或邻居?
答案 0 :(得分:2)
您可以过滤好友标识符的标签:
MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(other)
WHERE ALL( x IN ["Friend","Neighbour"] WHERE x IN labels(other) )
RETURN rebecca, other
注意:InverseFalcon的答案完全有效,这里只是另一种方法来进行此过滤。
请注意,这不是很理想,FRIEND
和NEIGHBOUR
在语义上最好被描述为关系,你可以在这里看到
远离自然的思维方式(关系很重要!)你在查询中会受到影响。
答案 1 :(得分:1)
我们可以在MATCH本身的标签上使用OR,因此您可能必须使用WHERE子句进行过滤:
from urllib.request import Request
myUrl = "http://aima.cs.berkeley.edu/data/iris.csv"
urlRequest = Request(myUrl)
请记住,像这样的可变长度关系匹配是为了找到所有可能的路径,直到给定的最大限制,所以这实际上是在做你可能不需要的额外工作,如果内部有很多关系,这可能会很慢那个本地图。
您可能需要考虑apoc.path.expandConfig() from APOC Procedures。如果你使用'NODE_GLOBAL'来表示唯一性,并用MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friendOrNeighbor)
WHERE friendOrNeighbor:Friend or friendOrNeighbor:Neighbor
RETURN DISTINCT rebecca, friendOrNeighbor
指定上限,那么它就是一种更有效的方法,可以更快地获得你想要的节点。