Complex Chunking with NLTK
your grammar is correct!

grammar = """MEDIA: {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}
           RELATION: {&lt;V.*&gt;}
                     {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}
           ENTITY: {&lt;NN.*&gt;}"""


by specifying 

RELATION: {&lt;V.*&gt;}
          {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}


you are indicating that there are two ways to generate the RELATION chunk i.e. {&lt;V.*&gt;} or {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}

so 

grammar = """MEDIA: {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}
               RELATION: {&lt;V.*&gt;}
                         {&lt;DT&gt;?&lt;JJ&gt;*&lt;NN.*&gt;+}
               ENTITY: {&lt;NN.*&gt;}"""
    chunkParser = nltk.RegexpParser(grammar)
    tagged = nltk.pos_tag(nltk.word_tokenize("adventure movies between 2000 and 2015 featuring performances by daniel craig"))

    tree = chunkParser.parse(tagged)

    for subtree in tree.subtrees():
        if subtree.label() == "RELATION": 
            print("RELATION: "+str(subtree.leaves()))


gives

RELATION: [('featuring', 'VBG')]