Hmm, well that "contains" requirement is something that's really only practical (would love to be shown to be wrong about this), with a filtered portal where you can use the patterncount function in the filter expression. "starts with" can be done, though even that best works with a recursive custom function that parses the text in category into a return delimitted list of values such as:
To use in the relationship. (Values separated by Return characters match a related record if any one value matches the value in the other field.)
if the user leaves the category field blank, how do I show all parts with all categories?
Set up some data on both sides of the relationship that match only if the category field on the parent side is empty.
On the parts table, define a calculation field such as: List ( Category ; "XXALLXX" )
You can also format Category as a check box field so that one part can be a member of more than one category. With this approach, Add "XXALLXX" and select this value for all existing part records. (This value can be auto-entered to select it for new records.)
On the parent record, define a calculation field such as IF ( IsEmpty ( Category ) ; "XXALLXX" ; Category ) and clear the "do not evaluate if all referenced fields are empty" check box inside the specify calculation dialog.