Querying for subsets in CloudSearch literal-array - amazon-cloudsearch

My index has a literal-array field foo and I want to search for documents whose foo is a subset of the values specified in a query.
For example, consider this index and a query for {A, B, D}:
doc1: foo=[A, B] --> returned bc {A,B} is a subset of query {A, B, D}
doc2: foo=[A, B, C] --> excluded bc C is not a member of {A, B, D}
Is it possible to construct such a query?

Related

How to yield results in table without duplicate result in Cypher?

Say I have node X that links to node A1, A2, A3 with edge A, node B1, B2 with edge B, and node C1 with edge C. I want to have a query like this:
match (x)-[:A]->(a)
match (x)<-[:B]-(b)
match (x)-[:C]-(c)
where x.name="X"
return a.name,b.name,c.name
And the result is this table:
a.name
b.name
c.name
A1
B1
C1
A2
B2
A3
Not a table of 6 combinations. Is that possible? The Neo4j Cypher Manual of RETURN isn't useful.
I would do this, with the advantage over Nathan's answer that it also yields a result in case some of the edge types are missing, e.g. when there is no B edge.
MATCH (x) WHERE x.name = 'X'
WITH x,
[(x)-[:A]->(a) | a] AS allAs,
[(x)<-[:B]-(b) | b] AS allBs,
[(x)-[:C]-(c) | c] AS allCs
WITH x, allAs, allBs, allCs, apoc.coll.max([size(allAs), size(allBs), size(allCs)]) as maxSize
UNWIND range(0, maxSize -1) as index
RETURN allAs[index].name as A, allBs[index].name as B, allCs[index].name as C
This will return each node matched with a, b, and c in exactly one row of the output.
match (x)-[:A]->(a)
where x.name="X"
WITH x, collect(a) as allAs
match (x)<-[:B]-(b)
WITH x, allAs, collect(b) as allBs
match (x)-[:C]-(c)
WITH x, allAs, allBs, collect(c) as allCs
WITH x, allAs, allBs, allCs, apoc.coll.max([size(allAs), size(allBs), size(allCs)]) as maxSize
UNWIND range(0, maxSize -1) as index
RETURN allAs[index].name as A, allBs[index].name as B, allCs[index].name as C

SQL: Finding all members of a group when they are only listed in pairs, and not all pairs are listed

I have some data that looks like this, and identifies pairs that are related:
From_ID To_ID
A C
B C
D E
E D (note this is the same pair as above, in a different order)
E F
A F
G H
Using the logic of 'if x is paired with y, and y is paired with z, then x is paired with z', how can I run an SQL query to return all members of a group?
So for the table above I would like a set of results that identifies or returns two groups: 'A, B, C, D, E, F' and 'G, H', not fussy about how this is done.
It feels like some kind of iterative query but I really have no idea where to start with this so any pointers would be appreciated.
edit: could be run in SQL Developer or HiveQL.

AB →→ C already in fourth normal form

Consider the following set of functional dependencies on the relation schema R = (A, B, C, D, E). Decompose the relation into a collection of relation schemas in 4NF. Provide detailed information of the decomposition process.
AB →→ C
B → D
A → E
If you start from the top with AB →→ C, doesn't that fit 4nf and you are done?

Oracle Spatial: how to query all polygons what are connected (recursivelly)?

Let's say we have 6 polygons ( A,B,C,D,E, F)in Spatial database.
A touches B,
B touches C and D,
E and F are not connected to other polygons.
A - B
/ \
C D E F
Having Polygon A, I need to query all polygons connected to it , and do it "recursivelly" Cannot describe it better. So the query by A should return A, B, C, D.
Of course, it is possible to do programmatically, first using SDO_RELATE query B by A, and then query C and D by B. But is it possible to do the task with a single query?

database index: why pairing

I have a table with multiple indexes, several of which duplicate the same columns:
Index 1 columns: X, B, C, D
Index 2 columns: Y, B, C, D
Index 3 columns: Z, B, C, D
I'm not very knowledgeable on indexing in practice, so I'm wondering if somebody can explain why X, Y and Z were paired with these same columns. B is an effective date. C is a semi-unique key ID for this table for a specific effective date B. D is a sequence that identifies the priority of this record for the identifier C.
Why not just create 6 indexes, one for each X, Y, Z, B, C, D?
I want to add an index to another column T, but in some contexts I'll only be querying on T alone while in others I will also be specifying the B, C and D columns... so should I create just one index like above or should I create one for T and one for (T, B, C, D)?
I've not had as much luck as expected when googling for comprehensive coverage of indexing. Any resources where I can get a through explanation and lots of examples of B-tree indexing?
The rule with indexing is that an index can be used to filter on any list of columns that constitute a prefix of the columns used for that index.
In other words, we can use Index 1 when we filter on X and B, or X, B and C, or just X, or all four.
However, we cannot use the index to filter "in the middle". This is because indexes work not entirely unlike concatenating the values of those columns for each row, and sorting the result. If we know what the thing we're looking for begins with, we can figure out where in the index to look - just like when doing binary search.
That's why a single index is no good: if we need to filter on B, C, D, and one of X, Y and Z, we need three indexes; X, Y is no good as an index for just filtering on Y, because the prefix of the values we're looking for - the X - is not known.
As Daniel mentioned, a covering index is a possible explanation for repeating B, C, and D: even if D is never filtered on, it may be the case that we need exactly the columns which you see in your indexes, and we can then just read the columns from the index instead of just using the index to locate the row.
One reason for having B, C and D in those indexes might be to have a covering index for frequently used queries. You will have a covering index when the index itself contains all the required data fields for a particular query.
A covering index can dramatically speed up data retrieval, since only the index pages, not the data pages, will be used to retrieve the data.
Below is an example query where index 1 would be a covering index:
SELECT B, C, D FROM table WHERE X = '10'
You should create it in (T, B, C, D).
Let's say you have two fields with an index in a table: A and B. When you create a separate index on each one of the columns, and have a query such as:
SELECT * FROM table WHERE A = 10 AND B = 20
What happens is either:
1) The DB creates two intermediate result-sets, one with rows where A = 10, and another one with rows where B = 20. It then has to merge these two result-sets into one (and also check for duplicate rows).
2) The DB creates one result-set with rows where A = 10. It then has to go manually through all of the rows in this intermediate result-set and check in each one where B = 10.
However when you know that index B depends on index A, and your query uses A before B, you can create one index for both of the columns: (A, B)
What this means that now the DB will first find all rows where A = 10, but because B is part of the same index, it can use the same index information to filter the result-set into rows where B is also 20. It doesn't have to make two intermediate result-sets + merge them, or only use one of the indexes and do manual scan for the other.
There might be other ways that the DB deals with these situations as well, it largely depends on an implementation.
The indexes in the form (X, B, C, D) can be used to optimize queries like:
... WHERE X rel sthg (possibly ORDER BY B, C, D)
... WHERE X = sthg AND B rel sthg (possibly ORDER BY C, D)
... WHERE X = sthf AND B = sthg AND C rel sthg (possibly ORDER BY D)
etc. where rel are arbitrary relation operators (<, >, =, <=, >=) and sthg are values or expressions. Especially the second two, and the sorting variants wouldn't be optimized by the "single column indexes variant".
OTOH, it cannot optimize a query
... WHERE B = sthg
because it starts in the middle of the index; here, the single column index would work.
For a resource where you can get a through explanation and lots of examples regarding indexes on Oracle (and any other Oracle-related issue), you should visit and bookmark askTom.