如何中断星云图数据库特定节点的查询链?

问题描述 投票:0回答:1

星云版

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"}]

enter image description here

如何修改查询以确保链在节点 c 处中断,并且忽略 c 之外的任何关系?

谢谢您的帮助!

graph-databases nebula-graph
1个回答
0
投票

您尝试过使用 openCypher 方法吗?

MATCH (a)-[e*]->(b) 
WHERE id(b)=="c" 
UNWIND e as e2 
RETURN DISTINCT e2
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.