为什么一个Neo4j关系在Cypher查询结果中显示两次? 让我们考虑一个有向关系的平凡图: CREATE (`0` :Car {value:"Ford"}) , (`1` :Car {value:"Subaru"}) , (`0`)-[:`DOCUMENT` {value:"DOC-1"}]->(`1`);
下面的查询为什么一个Neo4j关系在Cypher查询结果中显示两次? 让我们考虑一个有向关系的平凡图: CREATE (`0` :Car {value:"Ford"}) , (`1` :Car {value:"Subaru"}) , (`0`)-[:`DOCUMENT` {value:"DOC-1"}]->(`1`);,neo4j,cypher,Neo4j,Cypher,下面的查询MATCH(n1:Car)-[r:DOCUMENT]-(n2:Car)RETURN*返回: ╒══════════════════╤══════════════════╤═════════════════╕ │"n1" │"n2" │"r" │ ╞══════════════════╪══════════════════╪═════════════════╡ │{"value":"Subaru"}│{"val
MATCH(n1:Car)-[r:DOCUMENT]-(n2:Car)RETURN*
返回:
╒══════════════════╤══════════════════╤═════════════════╕
│"n1" │"n2" │"r" │
╞══════════════════╪══════════════════╪═════════════════╡
│{"value":"Subaru"}│{"value":"Ford"} │{"value":"DOC-1"}│
├──────────────────┼──────────────────┼─────────────────┤
│{"value":"Ford"} │{"value":"Subaru"}│{"value":"DOC-1"}│
└──────────────────┴──────────────────┴─────────────────┘
该图仅定义了一个Ford->Subaru
关系,为什么有两个关系?如何解释反向的一个(第1行;未在
CREATE
语句中指定)
注意:这是我之前所问问题的后续内容。我解决了我的问题,但我不相信我的答案是最好的解决方案。这里的匹配语句没有指定方向,因此有两个可能的路径将匹配模式(请记住,路径中节点的顺序很重要,并且可以区分路径之间的差异),因此,这两个答案是正确的 如果指定关系的方向,您将发现只有一个可能的路径匹配:
MATCH (n1:Car)-[r:DOCUMENT]->(n2:Car)
RETURN *
至于为什么忽略方向会得到两条路径,请记住路径是顺序敏感的:两条具有相同元素但元素顺序不同的路径是不同的路径
帮助把这个考虑进去,考虑下面两个查询:
# Query 1
MATCH (n1:Car)-[r:DOCUMENT]-(n2:Car)
WHERE n1.value = 'Ford'
RETURN *
╒══════════════════╤══════════════════╤═════════════════╕
│"n1" │"n2" │"r" │
╞══════════════════╪══════════════════╪═════════════════╡
│{"value":"Ford"} │{"value":"Subaru"}│{"value":"DOC-1"}│
└──────────────────┴──────────────────┴─────────────────┘
# Query 2
MATCH (n1:Car)-[r:DOCUMENT]-(n2:Car)
WHERE n1.value = 'Subaru'
RETURN *
╒══════════════════╤══════════════════╤═════════════════╕
│"n1" │"n2" │"r" │
╞══════════════════╪══════════════════╪═════════════════╡
│{"value":"Subaru"}│{"value":"Ford"} │{"value":"DOC-1"}│
└──────────────────┴──────────────────┴─────────────────┘
从概念上讲(在没有索引的情况下,规划人员也会使用),要获得上述每个结果,首先要获得描述中的完全匹配结果,然后过滤到唯一满足给定条件的结果
如果原始查询只返回一行而不是两行,则上述结果将与原始无方向匹配查询不一致
OP的其他信息 我需要一段时间来理解它,但它确实是这样工作的,这里有一个例子来确认它的设计: 当模式包含绑定关系,而该关系模式未指定方向时,Cypher将尝试在两个方向上匹配该关系
匹配(a)-[r]-(b)
其中id(r)=0
返回a、b
这将返回两个连接的节点,一个作为开始节点,一个作为结束节点
对我来说,没有指定方向的查询意味着匹配在图中找到的任何方向,但它必须是实际存在的关系。返回一个不存在的有什么意义?我不明白。这里什么都不存在。该关系存在,但由于尚未指定方向,因此图中有两个可能的路径匹配。这两条路径都存在,它们恰好使用相同的节点和相同的关系,只是开始节点和结束节点被切换,因此路径走向不同的方向。下面是让我感到困惑的地方——我创建了3个对象(2个节点和1个关系),然后一个查询返回4个对象。我要寻找的是关系世界的
SELECT*
的等价物。查询返回相同的对象,只是顺序不同。有两个可能的路径匹配给定的模式,涉及相同的节点和相同的关系,不同的是开始和结束节点的路径。路径是顺序敏感的。如果只希望强制一种可能的方式遍历关系,则需要有一个方向。