Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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
Python 查找与most条件匹配的实体_Python_Google App Engine_Google Cloud Datastore_Gql - Fatal编程技术网

Python 查找与most条件匹配的实体

Python 查找与most条件匹配的实体,python,google-app-engine,google-cloud-datastore,gql,Python,Google App Engine,Google Cloud Datastore,Gql,比如说,我有一些属性 color = blue age = 22 name = Tom 在数据存储中的许多实体中,如何获得与大多数属性匹配的实体?我当然可以做到: query.filter('color =', 'blue') query.filter('age =', '22') query.filter('name =', 'Tom') 但若不存在具有确切属性的实体,则不会给出结果。如何获取至少有两个筛选器匹配的实体,或者如果仍然不匹配,如何获取一个筛选器。。?它不需要计算值的相似性或其

比如说,我有一些属性

color = blue
age = 22
name = Tom
在数据存储中的许多实体中,如何获得与大多数属性匹配的实体?我当然可以做到:

query.filter('color =', 'blue')
query.filter('age =', '22')
query.filter('name =', 'Tom')

但若不存在具有确切属性的实体,则不会给出结果。如何获取至少有两个筛选器匹配的实体,或者如果仍然不匹配,如何获取一个筛选器。。?它不需要计算值的相似性或其他什么,只要给我大多数过滤器尽可能匹配的实体就可以了。

您基本上要求的是or运算符,这是不可能用单个查询实现的。我认为你有两个选择:

1) 通过子类化MultiQuery添加OR运算符。这仍然会在后台执行几个查询,并且排序和游标将不起作用

2) 预先计算三个属性的所有可能组合,将它们放入StringListProperty,然后使用IN运算符。例如,您的模型如下所示:

m.col_age_name = ['c:blue, a:22', 'c:blue, n:Tom', \
                  'a:22, n:Tom', 'a:22, c:blue, n:Tom']
然后运行过滤器:

q.filter('col_age_name IN', ['c:blue, a:22', 'c:blue, n:Tom', 'a:22, n:Tom'])
此解决方案存在以下问题:(a)它在后台执行多个查询,(b)您需要运行它三次(一次用于1、2和3个属性),(c)它不支持顺序或游标,以及(d)它使数据管理变得混乱。唯一的好处是,它将您需要进行的筛选器调用的最大数量从7个减少到3个


这显然比它的价值更麻烦。我只需要运行简单查询七次,这有缺点(a)和(c),但没有缺点(d)。

使用每种组合简单运行七次似乎是一个解决方案,但我有三个以上的属性作为示例。。。所以我觉得它最终总是会一团糟。使用in运算符需要N个筛选器调用,其中N是属性数。运行简单查询需要2^N-1次调用。但在引擎盖下,他们都做2^N-1查询。我会用一种简单的方法来做,不需要输入操作符。您可以使用itertools.compositions来帮助管理所有不同的查询。