我尝试了不同的方法,但我找不到解决问题的方法: 我的数据类似于表格,这意味着我对一组字符串的每个输入组合都有一个数据点(浮点数):
(a mapping of S × S → ℝ )
我想对架构进行建模,以便我可以执行以下查找:
由于映射是对称的(m(x,y) == m(y,x)
),如果我只需要存储
,那就太棒了
n*(n+1) / 2
个唯一值,而不是n^2
总映射。
到目前为止我尝试过:
但不幸的是,所有这些方法都不允许我做我需要的所有查询。 这在卡桑德拉甚至可能吗?
答案 0 :(得分:0)
Cassandra不支持您的第一个查询--- 所有字符串值都在某个范围内 ---因为目前,Cassandra只允许范围查询至少有一个{{1}在EQ
子句上。但是,您的第二个和第三个查询是可行的:)
示例强>
考虑以下示例:
WHERE
我们有以下元组:
cqlsh:so> desc table string_mappings;
CREATE TABLE string_mappings (
s1 ascii,
s2 ascii,
value float,
PRIMARY KEY (s1, s2, value)
)
您的第一个查询不起作用,因为Cassandra目前不支持cqlsh:so> select * from string_mappings;
s1 | s2 | value
-------+-------+-------
hello | hello | 1
hello | world | 0.2
stack | hello | 0
stack | stack | 1
stack | world | 0
world | world | 1
条款中没有EQ
的范围查询:
WHERE
但是,以下范围查询(您的第二个查询)没问题,因为它有一个cqlsh:so> select * from string_mappings where value>0.5;
Bad Request: PRIMARY KEY part value cannot be restricted (preceding part s2 is either not restricted or by a non-EQ relation)
:
EQ
并记住放置cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello' allow filtering;
s1 | s2 | value
-------+-------+-------
hello | hello | 1
关键字,否则您将收到以下错误:
ALLOW FILTERING
最后,您的第三个查询也不是问题:)
cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello';
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING