Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么一个Neo4j关系在Cypher查询结果中显示两次? 让我们考虑一个有向关系的平凡图: CREATE (`0` :Car {value:"Ford"}) , (`1` :Car {value:"Subaru"}) , (`0`)-[:`DOCUMENT` {value:"DOC-1"}]->(`1`);_Neo4j_Cypher - Fatal编程技术网

为什么一个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*
的等价物。查询返回相同的对象,只是顺序不同。有两个可能的路径匹配给定的模式,涉及相同的节点和相同的关系,不同的是开始和结束节点的路径。路径是顺序敏感的。如果只希望强制一种可能的方式遍历关系,则需要有一个方向。