Suppose we have a graph which represents a containment hierarchy:
Campaign -> Bundle -> Offer -> Product
A Campaign is a marketing campaign; a bundle is a collection of offers
within a campaign; a product is an item included within an offer. Each item
may have multiple parents (so it isn't simply a tree) - for example, the
same Offer may appear in multiple Bundles, the same Bundle may appear in
multiple Campaigns.
If we want to find which campaigns a given product is offered in, we can
traverse the graph upwards towards its "great-grandparents" in the
hierarchy. But for efficiency, we would like to have that information
immediately available in the Product node itself - for example:
MATCH c:Campaign --> b:Bundle --> o:Offer --> p:Product
WITH p, collect(distinct c) AS campaigns
SET p.campaign_names = [campaign in campaigns | campaign.name]
We then have a short-cut for finding which products are in a particular
campaign:
MATCH p:Product
WHERE "my campaign" IN p.campaign_names
RETURN p.name
This is not yet as efficient as it could be, because campaign_names is an
array property, so even if we have a schema index -
CREATE :Product(campaign_names)
- the index will not be used when matching on a single element in the
array, as above, because schema indexes currently only support total
matches.
We would like to use labels, rather than array properties, to identify
which campaigns a product is in. This makes sense because the relationship
between products and campaigns is ultimately one of set-membership. So if
we wanted the products in both CAMPAIGN_A and CAMPAIGN_B, it would be as
simple as doing
MATCH p:Product:`CAMPAIGN_A`:`CAMPAIGN_B`
RETURN p.name
However, there doesn't seem to be a way to set labels dynamically, based on
property values. In other words, there's no syntax like
MATCH c:Campaign --> b:Bundle --> o:Offer --> p:Product
WITH p, collect(distinct c) AS campaigns
FOREACH (campaign in campaigns | SET p:{campaign.name})
This would be useful to have. Are there any plans to add it to Cypher in
the future?
Thanks,
Dominic
--
You received this message because you are subscribed to the Google Groups
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.