3.8.0
Linux
我正在使用 Nebula Graph 数据库并尝试编写一个查询,该查询在遇到特定节点时停止链并忽略该节点之外的任何关系。例如,我有以下图形结构:
j -> k -> l
|
a -> b -> c -> d -> e
|
f -> g -> h
我想从节点a开始查询并沿着链进行查询,但是如果查询遇到节点
c
,它应该停止并且不包括从c到d和从d到e的关系,排除没有c
的结果
a -> b
|
f -> g -> h
这是顶点和边的设置:
USE ethereum;
-- Create addresses
INSERT VERTEX IF NOT EXISTS address() VALUES 'a':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'b':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'c':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'd':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'e':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'f':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'g':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'h':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'j':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'k':();
INSERT VERTEX IF NOT EXISTS address() VALUES 'l':();
-- Establish relationships
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"a" -> "b":(1622548800, 1234567, "0x123abc", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"b" -> "c":(1622549800, 1234568, "0x456def", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"c" -> "d":(1622550800, 1234569, "0x789ghi", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"d" -> "e":(1622551800, 1234570, "0xabcjkl", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"b" -> "f":(1622549800, 1234568, "0x456def", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"f" -> "g":(1622550800, 1234569, "0x789ghi", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"g" -> "h":(1622551800, 1234570, "0xabcjkl", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"j" -> "k":(1622552800, 1234571, "0xdefmno", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"k" -> "l":(1622553800, 1234572, "0xghipqr", "ETH");
INSERT EDGE erc20_transfer_to (transfer_timestamp, block_no, tx_hash, symbol) VALUES
"d" -> "j":(1622554800, 1234573, "0xklmstu", "ETH");
我尝试了以下查询来实现此目的,但它仍然包含从 d 到 e 的关系:
GO 1 TO 5 STEPS FROM "a"
OVER erc20_transfer_to
WHERE dst(edge) != "c"
YIELD src(edge) AS src, dst(edge) AS dst, edge AS e
结果包括:
src | dst | e
---|---|---
a | b | [:erc20_transfer_to "a"->"b" @0 {block_no: 1234567, symbol: "ETH", transfer_timestamp: 1622548800, tx_hash: "0x123abc"}]
-- | -- | --
j | k | [:erc20_transfer_to "j"->"k" @0 {block_no: 1234571, symbol: "ETH", transfer_timestamp: 1622552800, tx_hash: "0xdefmno"}]
b | f | [:erc20_transfer_to "b"->"f" @0 {block_no: 1234568, symbol: "ETH", transfer_timestamp: 1622549800, tx_hash: "0x456def"}]
f | g | [:erc20_transfer_to "f"->"g" @0 {block_no: 1234569, symbol: "ETH", transfer_timestamp: 1622550800, tx_hash: "0x789ghi"}]
c | d | [:erc20_transfer_to "c"->"d" @0 {block_no: 1234569, symbol: "ETH", transfer_timestamp: 1622550800, tx_hash: "0x789ghi"}]
d | e | [:erc20_transfer_to "d"->"e" @0 {block_no: 1234570, symbol: "ETH", transfer_timestamp: 1622551800, tx_hash: "0xabcjkl"}]
d | j | [:erc20_transfer_to "d"->"j" @0 {block_no: 1234573, symbol: "ETH", transfer_timestamp: 1622554800, tx_hash: "0xklmstu"}]
g | h | [:erc20_transfer_to "g"->"h" @0 {block_no: 1234570, symbol: "ETH", transfer_timestamp: 1622551800, tx_hash: "0xabcjkl"}]
如何修改查询以确保链在节点 c 处中断,并且忽略 c 之外的任何关系?
谢谢您的帮助!
您尝试过使用 openCypher 方法吗?
MATCH (a)-[e*]->(b)
WHERE id(b)=="c"
UNWIND e as e2
RETURN DISTINCT e2