将来自社区的Apache Cassandra专家和DataStax聚集在一起。

想学习吗?有一个问题?想分享您的专业知识吗?你是在正确的地方!

不知道从哪里开始? 入门

 

问题

raktim.0526_188212头像图片
raktim.0526_188212 ·

使用DSE Graph 6.7,是否可以在图顶点表上运行CQL搜索查询?

我创建了一个图模式(DSE 6.7),一个搜索索引,并将图数据插入其中。

schema.propertyKey("geoBoundary").Text().single().create()
schema.propertyKey("location").Point().withGeoBounds().single().create()
schema.vertexLabel("region").partitionKey("regionId").properties("name", "location", "geoBoundary").create()
schema.vertexLabel("region").index("search").search().by("geoBoundary").by("location").add()  
graph.addVertex(label,'region', 'regionId','0ab79c08-ef37-11e9-a713-2a2ae2dbcce8','location',Geo.point(149.0124,35.4735),'name','Dummy_ACT','geoBoundary',"MULTIPOLYGON (((-122.756762 49.000239, -117.033359 49.000239)), ((-122.718423 48.310145, -122.586977 48.35396, -122.608885 48.151313, -122.767716 48.227991, -122.718423 48.310145)), ((-123.025132 48.583992, -122.915593 48.715438, -122.767716 48.556607, -122.811531 48.419683, -123.041563 48.458022, -123.025132 48.583992)))");

SELECT name FROM test.region_p where solr_query='{"q":"*:*","fq":"geoBoundary:\"Intersects(MULTIPOLYGON (((-122.718423 48.310145))))\""}';
OR
SELECT name FROM test.region_p where solr_query='{"q":"*:*"}';

两者都抛出此错误,

搜索 queries are not allowed when the document unique key does not match the CQL primary key unless the query is a count or the selected columns are a subset of the unique key.

我无法使用Gremlin查询MULTIPOLYGONS,因为图形仅支持Point,Linestring和Polygon数据类型。我的数据也包含MULTIPOLYGONS。因此,这消除了Gremlin的使用。所以我的问题是,在不更改图形架构和数据的情况下,我可以使用solr_query参数运行CQL查询吗?

dse图形搜索
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。

1 回答

贝蒂娜·斯温纳顿头像图片
贝蒂娜·斯温纳顿 已回答 ·

你好 @ raktim.0526_188212,

您遇到了对图顶点表的多遍搜索查询的限制。

由于Cassandra中图形表的基础布局和架构(每个顶点可能有多行),因此DSE Graph 6.0和6.7中不允许对顶点表进行多遍搜索查询。

图形表上的搜索查询仅限于单遍查询。发出包含SOLR API的直接CQL语句的有效方法是仅检索select语句中的主键字段。

对于上下文,这是有关单遍查询的一些其他说明,引自 这里:

对于单遍查询,每个节点将读取满足查询的所有行,并将它们返回给协调器节点。一项高级功能,单遍分布式查询,在检索查询行期间节省了一次网络往返传输。

常规分布式查询(多遍查询)执行两次网络往返:

-从DSE搜索中检索满足查询要求的ID的第一个。

-第二个步骤,根据第一步中的ID,仅从数据库中检索满足查询条件的行。


在特定情况下,可以通过将属性名称滚动到分区键中来解决此限制:

schema.vertexLabel("region2").partitionKey("regionId", "name").properties("location", "geoBoundary").create()

然后,这使我可以执行指定的搜索查询:

cqlsh> SELECT name FROM test2.region2_p where solr_query='{"q":"*:*","fq":"geoBoundary:\"Intersects(MULTIPOLYGON (((-122.718423 48.310145))))\""}';

 name
------
(0 rows)

cqlsh> SELECT name FROM test2.region2_p where solr_query='{"q":"*:*"}';

 name
-----------
 Dummy_ACT
(1 rows)

在这种情况下,这可能效果很好。

通常,具有大量属性的分区键的缺点是,如果要基于分区键(不使用索引)进行查找,则需要提供所有属性。使用索引通常比基于分区键读取的数据要慢,请考虑到这一点。当然,问题仍然在于,这种模式更改是否适用于您现有的图形。

另一个一般说明,由于属性在顶点表中的表示方式,直接使用Search查询搜索图顶点表可能导致意外行为。在某些情况下,尤其是在寻呼的情况下,这是有问题的。我们一般不建议这样做。

我希望这有帮助!


附言感谢您提供有关问题的架构和数据,这确实有所帮助!

2 评论 分享
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。

@ bettina.swynnerton 非常感谢您始终提供详细而及时的回复!

0个赞 0 ·

非常欢迎您!

0个赞 0 ·